最近碰到一個需求是統計每週的周每一個用戶的局數總和、每個月每一個用戶的局數總和,首先有日表記錄每一個用戶天天的局數之和,日表的表結構以下:sql
create table user_day( log_date date not null, user_id int not null, round_count int not null );
表中數據以下:函數
那麼咱們能夠利用extract這個函數把日數據聚合爲週數據,SQL以下:code
SELECT log_year, log_week, user_id, SUM (round_count) AS round_count FROM ( SELECT EXTRACT (YEAR FROM log_date) AS log_year, EXTRACT (week FROM log_date) AS log_week, user_id, round_count FROM user_day ) AS A GROUP BY log_year, log_week, user_id ORDER BY log_year, log_week, user_id;
extract函數能夠從date類型或timestamp類型的變量中提取出年、月、日、時、分、秒這些數據,所以能夠從上述的log_date中提取出年和周來,將日數據變爲週數據,再對相同周進行group by便可獲得聚合後的週數據,以下所示:blog
同理,能夠從上述的log_date中提取出年和月來,而後將日數據變爲月數據,再對相同的月進行group by便可獲得聚合後的月數據,SQL以下:table
SELECT log_year, log_month, user_id, SUM (round_count) AS round_count FROM ( SELECT EXTRACT (YEAR FROM log_date) AS log_year, EXTRACT (MONTH FROM log_date) AS log_month, user_id, round_count FROM user_day ) AS A GROUP BY log_year, log_month, user_id ORDER BY log_year, log_month, user_id;
查詢結果以下:class