【问题标题】:SQL (Vertica) - Calculate number of users who returned to the app at least x days in the past 7 daysSQL (Vertica) - 计算过去 7 天内至少 x 天返回应用的用户数
【发布时间】:2017-05-26 05:45:21
【问题描述】:

假设我有我的table 喜欢:

uid  day_used_app   
---  -------------
1    2012-04-28      
1    2012-04-29        
1    2012-04-30        
2    2012-04-29       
2    2012-04-30 
2    2012-05-01       
2    2012-05-21        
2    2012-05-22   

假设我想要在过去 7 天内(来自2012-05-03)至少 2 天返回应用的唯一用户数。

以检索过去 7 天内至少 2 天使用过该应用程序的用户数为例:

select count(distinct case when num_different_days_on_app >= 2
                           then uid else null end) as users_return_2_or_more_days

    from (
         select uid,
                count(distinct day_used_app) as num_different_days_on_app
             from table
         where day_used_app between current_date() - 7 and current_date()
         group by 1

        )

这给了我:

users_return_2_or_more_days
---------------------------
            2

我的问题是:

如果我想对到目前为止的每一天都执行此操作以使我的表格看起来像这样,其中第二个字段等于在日期之前一周内返回 2 个或更多不同天的唯一用户数第一个字段。

        date               users_return_2_or_more_days
      --------             ---------------------------
    2012-04-28                        2
    2012-04-29                        2 
    2012-04-30                        3           
    2012-05-01                        4     
    2012-05-02                        4       
    2012-05-03                        3

【问题讨论】:

    标签: sql date vertica vsql


    【解决方案1】:

    这会有帮助吗?

    WITH
    -- your original input, don't use in "real" query ...
    input(uid,day_used_app) AS (
              SELECT 1,DATE '2012-04-28'
    UNION ALL SELECT 1,DATE '2012-04-29'
    UNION ALL SELECT 1,DATE '2012-04-30'
    UNION ALL SELECT 2,DATE '2012-04-29'
    UNION ALL SELECT 2,DATE '2012-04-30'
    UNION ALL SELECT 2,DATE '2012-05-01'
    UNION ALL SELECT 2,DATE '2012-05-21'
    UNION ALL SELECT 2,DATE '2012-05-22'
    )
    -- end of input, start "real" query here, replace ',' with 'WITH'
    ,
    one_week_b4 AS (
      SELECT
        uid
      , day_used_app
      , day_used_app -7 AS day_used_1week_b4
      FROM input
    )
    SELECT
      one_week_b4.uid
    , one_week_b4.day_used_app
    , count(*) AS users_return_2_or_more_days
    FROM one_week_b4
    JOIN input
      ON input.day_used_app BETWEEN one_week_b4.day_used_1week_b4 AND one_week_b4.day_used_app
    GROUP BY
      one_week_b4.uid
    , one_week_b4.day_used_app
    HAVING count(*) >= 2
    ORDER BY 1;
    

    输出是:

    uid|day_used_app|users_return_2_or_more_days
      1|2012-04-29  |                          3
      1|2012-04-30  |                          5
      2|2012-04-29  |                          3
      2|2012-04-30  |                          5
      2|2012-05-01  |                          6
      2|2012-05-22  |                          2
    

    这对您的需求有帮助吗?

    理智的马可 ...

    【讨论】:

    • 不完全。我正在尝试计算在任意 7 天窗口内的两个或多个不同天使用该应用程序的唯一用户数。我不确定您的查询计数。
    【解决方案2】:
    SELECT DISTINCT
        t1.day_used_app,
        (
            SELECT SUM(CASE WHEN t.num_visits >= 2 THEN 1 ELSE 0 END)
            FROM
            (
                SELECT uid,
                       COUNT(DISTINCT day_used_app) AS num_visits
                FROM table
                WHERE day_used_app BETWEEN t1.day_used_app - 7 AND t1.day_used_app
                GROUP BY uid
            ) t
       ) AS users_return_2_or_more_days
    FROM table t1
    

    【讨论】:

    • 感谢您的回答。不过,我认为您的查询正在做的是计算当天访问两次或更多的唯一用户数,而我在以下内容之后:给定日期 X,使用该应用程序的唯一用户数是多少在 date(X) - 7 和 date(X) 之间的两个或多个不同的日子?如果我错了,请纠正我! =]
    • @boldbrandywine 我更新了我的答案。我认为您可以使用相关子查询来计算 7 天窗口统计信息。
    • 有没有可能在没有相关子查询的情况下编写它? (Vertica 不支持它们)=]
    • @boldbrandywine 如果您的 Vertica 版本支持,唯一的替代方法可能是使用窗口函数。但我想不出办法。也许其他用户可以解决您的问题。
    猜你喜欢
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 2016-03-06
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多