如何从表中获取新用户,现有用户和非活动用户

时间:2015-11-07 21:04:51

标签: sql sql-server tsql data-warehouse

例如,下面是具有Month&的输入表。用户

table

需要输出:

NewUsers在那个月是新的。 ExistingUsers是该月的用户,上个月也有一些数据。非活动用户是上个月活跃但未在当月活跃的用户

output

有可能吗?

1 个答案:

答案 0 :(得分:0)

您可以使用窗口函数来实现:

  1. New User 是非常简单的COUNT行,其中rn = 1
  2. Existing Users :也很简单,COUNT行有rn> 1
  3. Inactive Users :有点复杂(从以前的行获取新的+现有和减去(新的+现有的)的总和。
  4. 代码:

    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步骤来删除重复项。