2017-02-24 71 views
2

我想收集MySQL-Table上的每週靜態數據。MySQL:使用子狀態(子查詢)彙總每週統計信息

表本身的結構如下:

user_id   action_id  created 
    0    123  2017-01-01 00.00:00 
    0    124    ... 
    1    123    ... 
    ...    ...    ... 

我想聚集每週靜爲:

  • 有多少用戶,其中活躍每週

    這很簡單:

    SELECT 
        YEARWEEK(created) as week, 
        COUNT(DISTINCT user_id) AS count 
    FROM data 
    GROUP BY YEARWEEK(created); 
    

    此外,我可以應用排序。

    結果是這樣的:

    week  count 
    201701  2 
    201702  3 
    
  • 有多少用戶,其中活躍每週的第一次 我想過使用子查詢解決它

    SELECT 
        YEARWEEK(created) as week, 
        COUNT(DISTINCT user_id) AS count, 
        (
        SELECT 
         COUNT(DISTINCT d2.user_id) 
        FROM data d2 
        WHERE YEARWEEK(d2.created) = week 
        AND NOT EXISTS (SELECT 1 FROM data d3 
        WHERE YEARWEEK(d3.created) < week AND d2.user_id = d3.user_id) 
    ) as countNewUsers 
    FROM data d1 
    GROUP BY YEARWEEK(created); 
    
  • 如何很多初級用戶其中每週活躍 初級用戶爲ac略去1之間 相關一週以上的一個類似之前的10倍,但與其他子查詢
  • 多少電力用戶其中活躍每週 高級用戶活躍10倍以上
  • 相關星期前

這可以按預期工作,但性能相當差,因爲子查詢是在分組發生之前進行評估的。數百萬行在表中,這需要很長的時間。

有沒有人有這個查詢更好的解決方案,理想情況下返回單個結果集中的所有值?

+2

沒有初級用戶和超級用戶的定義,不可能提供幫助。 –

+0

嘗試使用CTE而不是使用子查詢...只是意見 –

+0

Justed澄清了初級和高級用戶的定義。抱歉! – bumblebee

回答

1

我認爲你所有的查詢都可以從一個「中間」表派生。它會包含(yearweek,userid,count)。

  • 用戶每週活躍度:幾乎相同的查詢,但從這張表更快。
  • 活動首次:自加入關於用戶名和所需周與MIN(年周)
  • 之前使用目標周:... SUM(count) WHERE ... < week GROUP BY userid
  • 使用上述確定少年/電源的其中用戶ID。