[英]SQL Server - ROW_NUMBER() with PARTITION, how to get multiple records?
我正在為我的查詢而苦苦掙扎
SELECT * FROM (
SELECT ins.ID, ins.UnitElement_ID, ins.Date, ue.Code,
ROW_NUMBER() OVER (PARTITION BY ins.UnitElement_ID ORDER BY ins.Date DESC) AS lastAnomaly
FROM Inspection ins
INNER JOIN UnitElement ue ON ins.UnitElement_ID = ue.ID
INNER JOIN InspectionedAnomaly ia ON ia.Inspection_ID = ins.ID
WHERE ins.UnitElement_ID IN (3,10)
AND ins.Evaluation IS NOT NULL
) selectedAnomaly
輸出結果是
ID UnitElement_ID Date Code lastAnomaly
0 3020217 3 2020-10-30 12:09:50 F01001G2 1
1 3020217 3 2020-10-30 12:09:50 F01001G2 2
2 3020217 3 2020-10-30 12:09:50 F01001G2 3
3 3009055 10 2020-05-04 00:00:00 F01001M1 1
4 3009055 10 2020-05-04 00:00:00 F01001M1 2
5 3020224 10 2020-05-04 00:00:00 F01001M1 3
6 3020224 10 2020-05-04 00:00:00 F01001M1 4
7 670231 10 2019-07-23 00:00:00 F01001M1 5
8 670231 10 2019-07-23 00:00:00 F01001M1 6
9 576227 10 2018-11-05 00:00:00 F01001M1 7
當我添加 Where 子句WHERE lastAnomaly = 1
它工作得很好,但是當我的確切日期與“最近”日期(例如第 0、1 和 2 行)相同時,就會出現問題。
如果最近的日期相同,有沒有辦法提取 sql 查詢中的所有 3 行?
謝謝大家
使用rank()
和過濾:
SELECT *
FROM (SELECT ins.ID, ins.UnitElement_ID, ins.Date, ue.Code,
RANK() OVER (PARTITION BY ins.UnitElement_ID ORDER BY ins.Date DESC) AS lastAnomaly
FROM Inspection ins JOIN
UnitElement ue
ON ins.UnitElement_ID = ue.ID JOIN
InspectionedAnomaly ia
ON ia.Inspection_ID = ins.ID
WHERE ins.UnitElement_ID IN (3, 10) AND
ins.Evaluation IS NOT NULL
) sa
WHERE lastAnomaly = 1;
或者,如果您願意,可以使用MAX()
:
MAX(ins.DATE) OVER (PARTITION BY ins.UnitElement_ID) AS lastAnomalyDate
. . .
WHERE lastAnomalyDate = DATE
使用rank()
而不是row_number()
。 它為與OVER()
子句的ORDER BY
的行分配相同的等級。
所以:
SELECT *
FROM (
SELECT ins.ID, ins.UnitElement_ID, ins.Date, ue.Code,
RANK() OVER (PARTITION BY ins.UnitElement_ID ORDER BY ins.Date DESC) AS lastAnomaly
FROM Inspection ins
INNER JOIN UnitElement ue ON ins.UnitElement_ID = ue.ID
INNER JOIN InspectionedAnomaly ia ON ia.Inspection_ID = ins.ID
WHERE ins.UnitElement_ID IN (3,10)
AND ins.Evaluation IS NOT NULL
) selectedAnomaly
WHERE lastAnomaly = 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.