我有一个表,我试图从其中检索每个证券的最新头寸:
表:
我用于创建表的查询:SELECT id, security, buy_date FROM positions WHERE client_id = 4
+-------+----------+------------+
| id | security | buy_date |
+-------+----------+------------+
| 26 | PCS | 2012-02-08 |
| 27 | PCS | 2013-01-19 |
| 28 | RDN | 2012-04-17 |
| 29 | RDN | 2012-05-19 |
| 30 | RDN | 2012-08-18 |
| 31 | RDN | 2012-09-19 |
| 32 | HK | 2012-09-25 |
| 33 | HK | 2012-11-13 |
| 34 | HK | 2013-01-19 |
| 35 | SGI | 2013-01-17 |
| 36 | SGI | 2013-02-16 |
| 18084 | KERX | 2013-02-20 |
| 18249 | KERX | 0000-00-00 |
+-------+----------+------------+我一直在摆弄基于this page的查询版本,但是我似乎无法得到我想要的结果。
这是我一直在尝试的:
SELECT t1.id, t1.security, t1.buy_date
FROM positions t1
WHERE buy_date = (SELECT MAX(t2.buy_date)
FROM positions t2
WHERE t1.security = t2.security)但这只会返回给我:
+-------+----------+------------+
| id | security | buy_date |
+-------+----------+------------+
| 27 | PCS | 2013-01-19 |
+-------+----------+------------+我正在尝试获取每个证券的最大/最新购买日期,因此结果将为每个具有最新购买日期的证券显示一行。任何帮助都是非常感谢的。
编辑:职位id必须返回最大购买日期。
发布于 2014-04-25 14:36:35
您可以使用此查询。你可以在75%的时间内实现目标。我检查了更多的数据集。子查询需要更多的时间。
SELECT p1.id,
p1.security,
p1.buy_date
FROM positions p1
left join
positions p2
on p1.security = p2.security
and p1.buy_date < p2.buy_date
where
p2.id is null;SQL-小菜一碟link
发布于 2013-03-05 05:39:04
您可以使用子查询来获取结果:
SELECT p1.id,
p1.security,
p1.buy_date
FROM positions p1
inner join
(
SELECT MAX(buy_date) MaxDate, security
FROM positions
group by security
) p2
on p1.buy_date = p2.MaxDate
and p1.security = p2.security请参阅SQL Fiddle with Demo
或者,您可以将以下内容与WHERE子句一起使用:
SELECT t1.id, t1.security, t1.buy_date
FROM positions t1
WHERE buy_date = (SELECT MAX(t2.buy_date)
FROM positions t2
WHERE t1.security = t2.security
group by t2.security)请参阅SQL Fiddle with Demo
发布于 2013-03-05 05:31:40
这是通过一个简单的group by来完成的。您希望根据证券进行分组,并获得buy_date的最大值。SQL:
SELECT security, max(buy_date)
from positions
group by security请注意,这比bluefeet's answer更快,但不显示ID。
https://stackoverflow.com/questions/15211479
复制相似问题