选择具有最大日期的id并保持所有相同的最大日期SQL

时间:2018-06-08 23:22:48

标签: sql greatest-n-per-group

我有一个样本数据集

id  category  date        value
1   a         2013-01-02  7
2   a         2013-01-02  2
3   a         2013-01-01  3
4   b         2013-01-01  1
5   b         2013-01-02  4
6   b         2013-01-03  5
7   c         2013-01-03  4
8   c         2013-01-03  8

我想将下表作为输出

返回
id  date        
1   2013-01-02  
2   2013-01-02  
6   2013-01-03  
7   2013-01-03  
8   2013-01-03  

我使用以下代码获取结果,但日期只返回一次。我想保留两者。

SELECT id,date
FROM order t1
INNER JOIN 
(
   SELECT id, MAX(date) as maxdate
   FROM order
   GROUP BY category
) t2
ON t1.id = t2.id
AND t1.date = t2.maxdate

如果我有问题,请提供建议。

3 个答案:

答案 0 :(得分:2)

从您的示例中 - 您似乎想要一个查询,它为您提供与每个类别中的最大日期匹配的所有行?

如果是这样,您应该在整个类别中进行分组(不要从t2中获取ID)。子选择应该为您提供类别和最大日期,外部相关联接将为您提供与该类别和日期匹配的所有行。

SELECT category,id,date
FROM order t1
INNER JOIN 
(
   SELECT category, MAX(date) as maxdate
   FROM order
   GROUP BY category
) t2
ON t1.category = t2.category
AND t1.date = t2.maxdate

答案 1 :(得分:1)

如果您使用的是sql-server-2012及更高版本,您也可以使用它。

DECLARE @T TABLE (id INT,  category  VARCHAR(5), [date] date,        value int)
INSERT INTO @T VALUES

(1, 'a', '2013-01-02',  7),
(2, 'a', '2013-01-02',  2),
(3, 'a', '2013-01-01',  3),
(4, 'b', '2013-01-01',  1),
(5, 'b', '2013-01-02',  4),
(6, 'b', '2013-01-03',  5),
(7, 'c', '2013-01-03',  4),
(8, 'c', '2013-01-03',  8)

SELECT  id, [date] FROM (
    SELECT id, [date], RANK() OVER( PARTITION BY category order by [date] desc) RNK from @T
) AS t
WHERE RNK = 1

结果:

id          date      
----------- ----------
1           2013-01-02
2           2013-01-02
6           2013-01-03
7           2013-01-03
8           2013-01-03

答案 2 :(得分:0)

我会这样做只使用subquery

select o.*
from order o
where date = (select max(o1.date) 
              from order o1 
              where o1.category = o.category
             );