我有一个数据集,其中客户可能在一段时间内进行了多次评估。现在,每个客户对这些评估的行为可能会有所不同,这意味着 C1 可能在第 1 天、第 90 天、第 200 天等进行了评估,然后 C2 可能在第 1 天、第 14 天、第 21 天、第 36 天等进行了评估开。
我的目标是将这些单独的行转换为列。想知道以前是否有人有类似的要求。我正在使用 Excel 或 Power Query 或 SQL 来处理这个问题。
CustomerId Date Score
C1 1/1/2020 9
C1 1/7/2020 14
C1 1/14/2020 26
C2 1/9/2020 34
C2 3/9/2020 30
C2 6/9/2020 24
输出应该是:
客户/初始分数/平均+3个月/平均+6个月/平均+9个月/平均+12个月等等。
以下使用 SQL Server 语法。 (https://dbfiddle.uk/8WMfYXO4)
WITH initial AS (
SELECT CustomerId, MIN(Date) AS initial_date
FROM data
GROUP BY CustomerId
)
SELECT
a.CustomerId,
MAX(CASE WHEN a.Date = i.initial_date THEN a.Score END) AS Initial_Score,
AVG(CASE WHEN a.Date > i.initial_date AND a.Date <= DATEADD(month, 3, i.initial_date)
THEN a.Score END) AS Avg_3m,
AVG(CASE WHEN a.Date > DATEADD(month, 3, i.initial_date) AND a.Date <= DATEADD(month, 6, i.initial_date)
THEN a.Score END) AS Avg_6m,
AVG(CASE WHEN a.Date > DATEADD(month, 6, i.initial_date) AND a.Date <= DATEADD(month, 9, i.initial_date)
THEN a.Score END) AS Avg_9m,
AVG(CASE WHEN a.Date > DATEADD(month, 9, i.initial_date) AND a.Date <= DATEADD(month, 12, i.initial_date)
THEN a.Score END) AS Avg_12m
FROM data a
JOIN initial i ON a.CustomerId = i.CustomerId
GROUP BY a.CustomerId
ORDER BY a.CustomerId;
输出:
客户ID | 初始_分数 | 平均_3米 | 平均_6米 | 平均_9米 | 平均_12米 |
---|---|---|---|---|---|
C1 | 9 | 20 | 空 | 空 | 空 |
C2 | 34 | 30 | 24 | 空 | 空 |