2016-08-22 36 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