首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Groupwise最大值

Groupwise最大值
EN

Stack Overflow用户
提问于 2013-03-05 05:27:57
回答 5查看 6.1K关注 0票数 9

我有一个表,我试图从其中检索每个证券的最新头寸:

表:

我用于创建表的查询:SELECT id, security, buy_date FROM positions WHERE client_id = 4

代码语言:javascript
复制
+-------+----------+------------+
| 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的查询版本,但是我似乎无法得到我想要的结果。

这是我一直在尝试的:

代码语言:javascript
复制
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)

但这只会返回给我:

代码语言:javascript
复制
+-------+----------+------------+
| id    | security | buy_date   |
+-------+----------+------------+
|    27 | PCS      | 2013-01-19 |
+-------+----------+------------+

我正在尝试获取每个证券的最大/最新购买日期,因此结果将为每个具有最新购买日期的证券显示一行。任何帮助都是非常感谢的。

编辑:职位id必须返回最大购买日期。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-04-25 14:36:35

您可以使用此查询。你可以在75%的时间内实现目标。我检查了更多的数据集。子查询需要更多的时间。

代码语言:javascript
复制
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

票数 20
EN

Stack Overflow用户

发布于 2013-03-05 05:39:04

您可以使用子查询来获取结果:

代码语言:javascript
复制
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子句一起使用:

代码语言:javascript
复制
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

票数 9
EN

Stack Overflow用户

发布于 2013-03-05 05:31:40

这是通过一个简单的group by来完成的。您希望根据证券进行分组,并获得buy_date的最大值。SQL:

代码语言:javascript
复制
SELECT security, max(buy_date) 
from positions
group by security

请注意,这比bluefeet's answer更快,但不显示ID。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15211479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档