请求修改PostgreSQL SQL语句:按周统计去重user_id而非按月
没问题!把统计维度从月改成周很简单,核心是调整日期分组的方式,同时保证同一user_id在单周内仅被统计一次。这里给你两种适配不同数据库的实用写法:
方法1:用EXTRACT拆分年和周(兼容PostgreSQL、MySQL等)
SELECT COUNT(DISTINCT user_id) AS weekly_unique_users, EXTRACT(YEAR FROM created_at) AS year, EXTRACT(WEEK FROM created_at) AS week FROM user_logins WHERE created_at >= '2017-01-01' AND created_at <= '2018-04-10' GROUP BY EXTRACT(YEAR FROM created_at), EXTRACT(WEEK FROM created_at) ORDER BY year, week;
方法2:用to_char生成直观的年周标识(适合PostgreSQL等)
如果想要更易读的周格式(比如2017-01表示2017年第1周),可以用格式化函数:
SELECT COUNT(DISTINCT user_id) AS weekly_unique_users, to_char(created_at, 'YYYY-IW') AS year_week -- IW是ISO标准周,周一为周起始 FROM user_logins WHERE created_at >= '2017-01-01' AND created_at <= '2018-04-10' GROUP BY to_char(created_at, 'YYYY-IW') ORDER BY year_week;
小提醒
- 周定义差异:不同数据库的周计算逻辑可能不一样,比如MySQL的
WEEK()函数可以通过参数指定周起始日(周日/周一)。如果需要严格遵循ISO标准周(每年第一周至少包含4天),优先用YYYY-IW这类格式或者对应数据库的ISO周函数。 - 去重逻辑:
COUNT(DISTINCT user_id)已经自动处理了单周内同一用户的重复记录,不用额外加子查询或者窗口函数。 - 排序优化:按年+周排序能避免跨年周出现顺序混乱的问题,确保结果按时间先后展示。
内容的提问来源于stack exchange,提问作者Maf Pipo
相关产品推荐
相关产品推荐

