[英]SQL Query - Partition by
從下表中,需要以綠色讀取所有記錄。 對於按sfdc_acc
列划分的每個組,請根據狀態檢索最新記錄。 如果一個分區中的狀態為“可用”或“不可用”,則需要使用“可用”來檢索最新記錄。
該查詢未返回預期的正確結果:
SELECT
A.*
FROM
(SELECT
TEMP.*,
ROW_NUMBER () OVER (PARTITION BY ERP_ACC
ORDER BY LASTMODIFIEDDATE DESC, STATUS ASC) AS RN
FROM
TEMP) A
WHERE
A.RN = 1
如何修改查詢以在分區子句中包括狀態檢查?
為什么不僅對Available
記錄應用過濾器。
SELECT A.* FROM
(
SELECT TEMP.*,ROW_NUMBER () OVER (PARTITION BY ERP_ACC ORDER BY LASTMODIFIEDDATE DESC) AS RN FROM TEMP
where STATUS = 'Available'
) A WHERE A.RN=1
我想你要:
SELECT A.*
FROM (SELECT T.*,
ROW_NUMBER () OVER (PARTITION BY ERP_ACC, STATUS ORDER BY LASTMODIFIEDDATE DESC) AS RN
FROM TEMP T
) T
WHERE STATUS = 'Available' AND T.RN = 1;
假設您只需要可用狀態:
DECLARE @Table TABLE ( LASTMODIFIEDDATE DATETIME, ERP_ACC int, sfdc_acc VARCHAR(20), status VARCHAR(20))
INSERT INTO @Table VALUES ('3/31/2017', 156, 'ABC', 'Available')
INSERT INTO @Table VALUES ('3/30/2017', 678, 'ABC', 'Available')
INSERT INTO @Table VALUES ('10/17/2016', 872, 'ABC', 'Available')
INSERT INTO @Table VALUES ('08/02/2016', 900, 'ABC', 'Available')
INSERT INTO @Table VALUES ('06/09/2017', 100, 'GHK', 'Not Available')
INSERT INTO @Table VALUES ('05/01/2017', 456, 'GHK', 'Not Available')
INSERT INTO @Table VALUES ('08/02/2016', 954, 'GHK', 'Available')
更新了我的答案,請注意將條件設置為“狀態”。 如果“可用”,則為1,如果沒有,則為2。這將確保所有狀態為“可用”的記錄都是優先級。
SELECT * FROM
(SELECT LASTMODIFIEDDATE,
ERP_ACC,
sfdc_acc,
status, ROW_NUMBER () OVER (PARTITION BY sfdc_acc
ORDER BY
CASE WHEN status = 'Available' THEN 1 ELSE 2 END ASC,
LASTMODIFIEDDATE DESC) AS RN FROM @Table) A
WHERE A.RN = 1
這樣的事情應該起作用。 您需要先按狀態排序,然后再按時間戳排序,以便首先放置“可用”記錄,然后再放置其他所有內容。
SELECT
A.*
FROM
(SELECT
TEMP.*,
ROW_NUMBER () OVER (PARTITION BY ERP_ACC
ORDER BY CASE WHEN STATUS = 'Available' THEN 1 ELSE 2 END, LASTMODIFIEDDATE DESC) AS RN
FROM
TEMP) A
WHERE
A.RN = 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.