我有一个样本数据集
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
如果我有问题,请提供建议。
答案 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
);