SQL - 返回每场比赛的前两个结果

SQL - Returning the Top two Results for Each Match

我有一种情况,我们将 MEMBER table 中成员记录的列的每个更改记录为单独的行。记录的更改仅显示更改的列名、新值和更改日期。

示例:Table 名称 - CustomerChanges

customerId columnName newValue dateChanged
1234 status Active 1/12/2021
1234 status Cancelled 9/30/2020
1234 status Frozen 7/1/2020
1234 status Active 1/1/2020
5678 status Active 1/11/2021
5678 status Frozen 11/1/2020
5678 status Active 2/1/2020
9101 status Active 1/10/2021
9101 type Full Time 1/10/2021
9101 status Frozen 10/15/2020
9101 status Active 1/1/2020

我需要在这里做 3 件事:

  1. 仅提取 status 的所有更改
  2. 获取从 FrozenActive 的所有客户。我相信解决这个问题的方法是为每个 customerId 拉出前两个记录,然后看看谁从 FrozenActive
  3. 谁在指定的时间范围内完成了...在本例中为 January

注意事项:

  1. 如前所述,table 所有列都有变化,只是 status 列没有变化。
  2. 客户可以有多个条目 status 更改。

我在 SSRS 工作并且一直在努力解决这个问题。我尝试查询 table 以了解对 columnName 列的更改,按 CustomerId 对其进行分组,获取前两行,然后查看哪些从 Frozen 变为 Active.

提前谢谢你。

这有点乱,可能有更好的方法,但这应该可行。

您必须调整最内层的查询以根据您的日期范围进行过滤,我没有包括那部分。

我重新创建了你的数据集,然后生成了如下输出

DECLARE @t TABLE (customerId int, columnName varchar(20), newValue varchar(20), dateChanged date)
INSERT INTO @t VALUES 
(1234, 'status', 'Active'   , '2021-01-12' ),
(1234, 'status', 'Cancelled', '2020-09-30' ),
(1234, 'status', 'Frozen'   , '2020-07-01' ),
(1234, 'status', 'Active'   , '2020-01-01' ),
(5678, 'status', 'Active'   , '2021-01-11' ),
(5678, 'status', 'Frozen'   , '2020-11-01' ),
(5678, 'status', 'Active'   , '2020-02-01' ),
(9101, 'status', 'Active'   , '2021-01-10' ),
(9101, 'type', 'Full Time'  , '2021-01-10' ),
(9101, 'status', 'Frozen'   , '2020-10-15' ),
(9101, 'status', 'Active'   , '2020-01-01' )

--SELECT * FROM @t

SELECT * FROM 
    (
    SELECT
        s.* 
        , LAG(newValue, 1) OVER(PARTITION BY customerId ORDER BY dateChanged) AS PreviousStatus 
        FROM 
        (SELECT *, ROW_NUMBER() OVER(PARTITION BY CustomerID ORDER BY dateChanged DESC) as RowN
            FROM @t 
            WHERE columnName = 'Status' -- Add date filtering here
        ) s
        WHERE s.RowN < =2
    ) x 
    WHERE newValue = 'Active' AND PreviousStatus = 'Frozen'

这给出了以下输出