2016-08-22 103 views
1
CarID Date    Shift 
1  2016-08-20  3 
1  2016-08-21  1 
1  2016-08-21  2 
2  2016-08-20  1 
3  2016-08-21  3 

预期结果如何基于3列

CarID Date    Shift 
1  2016-08-21  2 
2  2016-08-20  1 
3  2016-08-21  3 

如何写这样的查询,以获得每一辆汽车的顶部1的记录,最大日期和最大位移的组合选择顶部1 ?

回答

6

您可以在CTE使用排序功能ROW_NUMBER,例如:

WITH CTE AS 
(
    SELECT RN = ROW_NUMBER() OVER (PARTITION BY CarID ORDER BY Date DESC, Shift DESC), * 
    FROM dbo.TableName t 
) 
SELECT * FROM CTE 
WHERE RN = 1 
2

,如果你想要的是在同一行日期和移位的最大值:

select top 1 with ties CarId, [Date], Shift 
    from myTable 
    order by row_number() over (partition by CarId order by [Date] desc, Shift desc); 
+0

被低估的答案! – gofr1

+0

@ gofr1非常感谢,看到标点符号上的差别很大。 – vercelli

0

另一种方式与OUTER APPLY:

SELECT DISTINCT b.* 
FROM YourTable a 
OUTER APPLY (
    SELECT TOP 1 * 
    FROM YourTable 
    WHERE CarID=a.CarID 
    ORDER BY [Date] DESC, [Shift] DESC) as b 

输出:

CarID Date  Shift 
1  2016-08-21 2 
2  2016-08-20 1 
3  2016-08-21 3