最近碰到一个需求是统计每周的周每一个用户的局数总和、每个月每一个用户的局数总和,首先有日表记录每一个用户天天的局数之和,日表的表结构以下: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