如何在PostgreSQL数据库中按日期分组数据?附示例数据
PostgreSQL按日期分组统计操作数据
看起来你想要对PostgreSQL里的用户操作数据按日期进行分组分析,结合你给出的示例数据,我整理了几个实用的SQL查询方案,帮你快速得到想要的统计结果~
你的示例数据
| id | user_name | date | action |
|---|---|---|---|
| 1 | user_1 | 2018-05-05 | start |
| 2 | user_1 | 2018-05-05 | stop |
| 3 | user_2 | 2018-05-05 | start |
| 4 | user_2 | 2018-05-05 | stop |
| 5 | user_1 | 2018-05-06 | start |
| 6 | user_1 | 2018-05-06 | start |
| 7 | user_1 | 2018-05-06 | stop |
| 8 | user_2 | 2018-05-06 | start |
| 9 | user_2 | 2018-05-06 | stop |
方案1:按日期+用户分组,统计各操作类型数量
如果需要查看每天每个用户的start/stop操作次数,用这个查询:
SELECT date, user_name, COUNT(CASE WHEN action = 'start' THEN 1 END) AS start_count, COUNT(CASE WHEN action = 'stop' THEN 1 END) AS stop_count, COUNT(*) AS total_actions FROM your_table_name -- 替换成你的实际表名 GROUP BY date, user_name ORDER BY date, user_name;
结果说明
- 会按日期和用户名聚合数据,分别算出每个用户每天的start次数、stop次数,以及总操作数
ORDER BY让结果按日期和用户名排序,方便查看趋势
方案2:仅按日期分组,统计全量每日数据
如果只需要每天整体的操作统计(比如当天总共有多少次start、多少活跃用户),可以用这个:
SELECT date, COUNT(CASE WHEN action = 'start' THEN 1 END) AS total_starts, COUNT(CASE WHEN action = 'stop' THEN 1 END) AS total_stops, COUNT(DISTINCT user_name) AS unique_active_users, COUNT(*) AS total_daily_actions FROM your_table_name -- 替换成你的实际表名 GROUP BY date ORDER BY date;
结果说明
- 统计当天所有用户的启动/停止总次数,以及活跃用户数(去重后的用户数量)
- 适合做每日运营数据汇总
补充:如果date字段是带时间戳的类型
如果你的date字段实际是timestamp或timestamptz类型(即包含具体时间),可以用DATE()函数提取纯日期部分来分组:
SELECT DATE(date) AS action_date, -- 提取日期部分,忽略时分秒 user_name, COUNT(CASE WHEN action = 'start' THEN 1 END) AS start_count FROM your_table_name GROUP BY DATE(date), user_name ORDER BY action_date;
内容的提问来源于stack exchange,提问作者Grzegorz Kawalec
相关产品推荐
相关产品推荐

