簡體   English   中英

SQL Server - 帶分區的 ROW_NUMBER(),如何獲取多條記錄?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM