例如,下面是具有Month&的输入表。用户
需要输出:
NewUsers在那个月是新的。 ExistingUsers是该月的用户,上个月也有一些数据。非活动用户是上个月活跃但未在当月活跃的用户
有可能吗?
答案 0 :(得分:0)
您可以使用窗口函数来实现:
New User
是非常简单的COUNT
行,其中rn = 1 Existing Users
:也很简单,COUNT
行有rn> 1 Inactive Users
:有点复杂(从以前的行获取新的+现有和减去(新的+现有的)的总和。代码:
WITH cte AS
(
SELECT *
,rn = ROW_NUMBER() OVER (PARTITION BY UserKey ORDER BY MonthId)
FROM #tab t1
), cte2 AS(
SELECT
MonthId,
[New_User] = COUNT(CASE WHEN rn = 1 THEN 1 END),
[Existing_User] = COUNT(CASE WHEN rn > 1 THEN 1 END),
[s] = COUNT(rn)
FROM cte
GROUP BY MonthId
)
SELECT
MonthId,
[New_User],
[Existing_User],
[Inactive_User] = CASE WHEN [s] - LAG(s, 1) OVER(ORDER BY MonthId) < 0
THEN ABS([s] - LAG(s, 1) OVER(ORDER BY MonthId))
ELSE 0
END
FROM cte2
ORDER BY MonthId;
的 LiveDemo
强>
输出:
╔═════════╦═══════════╦════════════════╦════════════════╗
║ MonthID ║ New_Users ║ Existing_Users ║ Inactive_Users ║
╠═════════╬═══════════╬════════════════╬════════════════╣
║ 201411 ║ 1 ║ 0 ║ 0 ║
║ 201412 ║ 1 ║ 1 ║ 0 ║
║ 201501 ║ 1 ║ 2 ║ 0 ║
║ 201502 ║ 0 ║ 2 ║ 1 ║
╚═════════╩═══════════╩════════════════╩════════════════╝
警告:的
我假设每个MonthId的数据为UNIQUE
,如果不再添加一个CTE步骤来删除重复项。