我希望有人能指出我正确的方向。关于在SQL Server表中对记录进行排名,我有一个独特的要求。表格看起来像这样......
此表显示健康俱乐部的成员及其各种状态变化(A =活动,C =已取消)。我想以一种独特的方式对这些状态变化进行排名。我想首先将A记录设为1,然后忽略接下来的3个A记录。然后,第一个C记录也将排名为1,后面的A记录的排名为2.再次,我想在下一个C记录之前忽略以下3个A记录。
您可能想知道为什么我们会看到多个相同的状态与新的/从时间段。这是b / c这来自一个更大的数据集,其中其他列实际上已更改,而状态保持不变。我的最终目标是仅提出相关(排名)行并根据排名匹配活动/已取消行。然后我会创建一个全新的表/查询来为不同时期建立新的From / To日期。
感谢您提出的任何建议!!
答案 0 :(得分:0)
我认为您正在寻找DENSE_RANK
https://docs.microsoft.com/en-us/sql/t-sql/functions/dense-rank-transact-sql
答案 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字段执行了排名,并按状态分区。