PostgreSQL中统计每个客户有记录的天数
统计每个客户存在记录的天数(PostgreSQL实现方案)
这个需求在PostgreSQL里实现起来很直观,核心思路就是把每条记录的时间戳归到对应的日期维度,再按客户去重统计不同日期的数量。
核心SQL代码
SELECT customer_id, COUNT(DISTINCT created_at::date) AS active_days FROM your_table_name -- 替换成你的实际表名 GROUP BY customer_id ORDER BY customer_id;
代码细节解释
created_at::date:把带时区的时间戳转换为日期类型(PostgreSQL会自动处理时区逻辑,你的数据是+00时区,直接转成UTC日期即可)。如果需要按特定时区统计日期,可以改成created_at AT TIME ZONE 'Asia/Shanghai'::date这类写法,替换成你需要的时区标识。COUNT(DISTINCT ...):对每个客户的日期做去重后计数,这样同一天内的多条重复记录只会被统计1次,完美匹配“存在记录的天数”需求。GROUP BY customer_id:按客户ID分组,确保每个客户只输出一行统计结果,清晰对应到单个客户的活跃天数。
结合你的示例数据验证
用你提供的测试数据运行上述SQL,会得到如下结果:
| customer_id | active_days |
|---|---|
| 1000 | 4 |
| 1001 | 3 |
| 1002 | 2 |
对应每个客户的天数逻辑:
- 1000:记录分布在2017-12-29、2017-12-30、2018-01-02、2018-01-03,共4天
- 1001:记录分布在2017-12-30、2018-01-02、2018-01-03,共3天
- 1002:记录分布在2017-12-30、2018-01-02,共2天(同一天内的两条记录只算1天)
内容的提问来源于stack exchange,提问作者Milkncookiez
相关产品推荐
相关产品推荐

