-2

我希望有人可以在这里为我指明正确的方向。对于 SQL Server 表中的记录排名,我有一个独特的要求。桌子长这样... 状态变化表

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

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

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

4

3 回答 3

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;
于 2017-08-03T16:21:19.180 回答
0

我想你正在寻找DENSE_RANK

https://docs.microsoft.com/en-us/sql/t-sql/functions/dense-rank-transact-sql

于 2017-08-03T15:56:57.463 回答
0

感谢您的输入。我想出了一个对我有用的解决方案。它首先涉及在状态列上使用 LAG() 函数。从那里,我创建了一个“RankingFlag”字段。如果当前行的状态为 NULL 或 <=> 到 LAG 状态(上一行),则标志值将为 1。接下来,我刚刚对所有这些 RankingFlag=1 字段进行了排名,并按状态进行了分区。

于 2017-08-03T18:44:52.197 回答