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 件事:
- 仅提取
status
的所有更改
- 获取从
Frozen
到 Active
的所有客户。我相信解决这个问题的方法是为每个 customerId
拉出前两个记录,然后看看谁从 Frozen
到 Active
。
- 谁在指定的时间范围内完成了...在本例中为
January
。
注意事项:
- 如前所述,table 所有列都有变化,只是
status
列没有变化。
- 客户可以有多个条目
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'
这给出了以下输出
我有一种情况,我们将 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 件事:
- 仅提取
status
的所有更改 - 获取从
Frozen
到Active
的所有客户。我相信解决这个问题的方法是为每个customerId
拉出前两个记录,然后看看谁从Frozen
到Active
。 - 谁在指定的时间范围内完成了...在本例中为
January
。
注意事项:
- 如前所述,table 所有列都有变化,只是
status
列没有变化。 - 客户可以有多个条目
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'
这给出了以下输出