SQL Server排名 - 忽略重复的行值

时间:2017-08-03 15:27:54

标签: sql-server while-loop cursor ranking-functions

我希望有人能指出我正确的方向。关于在SQL Server表中对记录进行排名,我有一个独特的要求。表格看起来像这样...... Status Change Table

此表显示健康俱乐部的成员及其各种状态变化(A =活动,C =已取消)。我想以一种独特的方式对这些状态变化进行排名。我想首先将A记录设为1,然后忽略接下来的3个A记录。然后,第一个C记录也将排名为1,后面的A记录的排名为2.再次,我想在下一个C记录之前忽略以下3个A记录。

您可能想知道为什么我们会看到多个相同的状态与新的/从时间段。这是b / c这来自一个更大的数据集,其中其他列实际上已更改,而状态保持不变。我的最终目标是仅提出相关(排名)行并根据排名匹配活动/已取消行。然后我会创建一个全新的表/查询来为不同时期建立新的From / To日期。

感谢您提出的任何建议!!

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

这是你正在寻找的吗?

WITH 
    cte1 AS (
        SELECT 
            td.memid, td.DateFrom, td.DateTo, td.Status,
            R1 = ROW_NUMBER() OVER (ORDER BY td.DateFrom),
            R2 = ROW_NUMBER() OVER (PARTITION BY td.Status ORDER BY td.DateFrom)
        FROM
            #TestData td
        ),
    cte2 AS (
        SELECT 
            c1.memid, c1.DateFrom, td.DateTo, c1.Status, c1.R1,
            R3 = ROW_NUMBER() OVER (PARTITION BY c1.R1 - c1.R2 ORDER BY c1.R1)
        FROM
            cte1 c1
        )
SELECT 
    c2.memid, c2.DateFrom, td.DateTo, c2.Status,
    DENSE_RANK() OVER (ORDER BY c2.R1 - c2.R3)
FROM
    cte2 c2;

答案 2 :(得分:0)

感谢投票人员。我想出了一个对我有用的解决方案。它涉及首先在status列上使用LAG()函数。从那里,我创建了一个" RankingFlag"领域。如果当前行的状态为NULL或< =>,则标志值将为1。到LAG状态(上一行)。接下来,我只对所有那些RankingFlag = 1字段执行了排名,并按状态分区。