1

我試圖找出每月執行操作A或操作B的#個用戶。加入generate_series並計數

表:用戶 - 編號 - 「creationDate」

表:action_A - USER_ID(= user.id) - 「creationDate」

表:action_B - USER_ID(=用戶。 「creationDate」

我想要做的一般想法是,我會找到在第X個月執行操作A的用戶列表,以及在第X個月執行操作B的用戶列表,然後計算如何馬根據每月生成的日期系列,每個月都會有ny ID。

我嘗試了以下操作,但是,查詢在運行時超時並且我不確定是否有任何方法來優化它(或者它甚至是正確的)。

SELECT monthseries."Month", count(*) 
FROM 
    (SELECT to_char(DAY::date, 'YYYY-MM') AS "Month" 
    FROM generate_series('2014-01-01'::date, CURRENT_DATE, '1 month') DAY) monthseries 
LEFT JOIN 
    (SELECT to_char("creationDate", 'YYYY-MM') AS "Month", 
      id 
    FROM action_A) did_action_A ON monthseries."Month" = did_action_A."Month" 
LEFT JOIN 
    (SELECT to_char("creationDate", 'YYYY-MM') AS "Month", 
      id 
    FROM action_B) did_action_B ON monthseries."Month" = did_action_B."Month" 
GROUP BY monthseries."Month" 

任何意見/幫助將非常有幫助!

+0

IMO它的清潔使用'date_trunc( '月', 「creationDate」)'代替'to_char'。否則看起來理智。查詢的'EXPLAIN'輸出是什麼? – 2014-09-26 00:45:11

+0

你想在每個月或總ID中統計不同的ID? – 2014-09-26 09:09:28

+0

謝謝! Clodoaldo回答了我的問題,是的,我試圖計數明確的ID :)我將確保將來使用date_trunc! :) – christinang89 2014-09-26 20:15:26

回答

1

如果你想數不同用戶:

select to_char(month, 'YYYY-MM') as "Month", count(*) 
from 
    generate_series(
     '2014-01-01'::date, current_date, '1 month' 
    ) monthseries (month) 
    left join (
     (
      select distinct date_trunc('month', "creationDate") as month, id 
      from action_a 
     ) a 
     full outer join (
      select distinct date_trunc('month', "creationDate") as month, id 
      from action_b 
     ) b using (month, id) 
    ) s using (month) 
group by 1 
order by 1 
+0

謝謝!有一個輕微的語法錯誤「... b使用(月,ID)」的「開」沒有必要:) – christinang89 2014-09-26 20:13:24

+0

@ christinang89當然,更正 – 2014-09-26 20:23:15