简体   繁体   English

SQL查询-分区依据

[英]SQL Query - Partition by

From below table, need to fetch all records in green. 从下表中,需要以绿色读取所有记录。 For each group partitioned by sfdc_acc column, retrieve the latest record on the basis of status. 对于按sfdc_acc列划分的每个组,请根据状态检索最新记录。 In case if status is Available or NotAvailable in one partition, need to retrieve the latest record with Available. 如果一个分区中的状态为“可用”或“不可用”,则需要使用“可用”来检索最新记录。

表

This query is not returning the proper result as expected: 该查询未返回预期的正确结果:

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

How should I modify the query to include status check in partition clause? 如何修改查询以在分区子句中包括状态检查?

Why don't you apply filter for Available records only. 为什么不仅对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

I think you want: 我想你要:

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;

assuming that you only need the available status: 假设您只需要可用状态:

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')

Updated my answer, notice the condition to set to rank Status. 更新了我的答案,请注意将条件设置为“状态”。 if Available then 1, if not, then 2. this would ensure that all records with status "Available" is the priority. 如果“可用”,则为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 

Something like this should work. 这样的事情应该起作用。 You need to sort by status first then by timestamp to put 'Available' records first then everything else second. 您需要先按状态排序,然后再按时间戳排序,以便首先放置“可用”记录,然后再放置其他所有内容。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM