2017-05-26 33 views
1

假設我有我的table這樣的:SQL(Vertica的) - 計算誰返回到應用程序的用戶數量至少在X天在過去7天

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天內至少2天不同的應用程序(從2012-05-03)。

因此,作爲一個例子來檢索誰使用,在過去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或mo的唯一用戶的數量在第一個字段的日期之前的一週內重新設置不同的日期。

 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 

回答

0
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 
+0

我很感謝您的回答。不過,我認爲你的查詢在做的是統計當天訪問兩次或更多次的唯一用戶的數量,而我的結果如下:給定日期X,使用該應用程序的用戶的唯一數量是多少在日期(X) - 7和日期(X)之間的兩個或多個不同日期?如果我錯了,請糾正我的錯誤! =] – boldbrandywine

+0

@boldbrandywine我更新了我的答案。我想你可以使用相關子查詢來計算7天窗口統計。 –

+0

任何機會,這可以寫沒有相關的子查詢? (Vertica不支持它們)=] – boldbrandywine

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 

這是否幫助你的需求?

Marco the Sane ...

+0

不完全。我試圖計算在任意7天窗口內兩個或多個不同日期內使用該應用程序的唯一用戶數量。我不確定你的查詢在計算什麼。 – boldbrandywine

相關問題