PostgreSQL查询近x天按日去重的重复交易数据实现方案
问题处理方案
你之前的SQL统计的是符合条件的交易总笔数,同一天的多笔交易会被重复计数,所以和预期不符。要实现单日多笔仅计1次的需求,只需要对交易日期做去重计数即可。
核心实现逻辑
- 把
created_at的时分秒截断,仅保留日期维度 - 对处理后的日期做去重计数,得到有效交易天数
- 只需判断有效天数是否等于要校验的x天,即可得到是否符合规则的布尔结果
PostgreSQL 实现语句(适配你原有语法)
1. 查询有效交易天数
SELECT COUNT(DISTINCT DATE(created_at)) AS valid_days FROM transactions WHERE user_id = 1 -- 替换为目标用户ID AND currency = 'USD' -- 替换为目标币种 AND amount = 200 -- 替换为目标校验金额 AND created_at >= NOW() - INTERVAL '5 DAY'; -- 把5替换为你需要校验的天数x
2. 直接返回是否符合规则的布尔值
SELECT COUNT(DISTINCT DATE(created_at)) = 5 AS is_qualified FROM transactions WHERE user_id = 1 AND currency = 'USD' AND amount = 200 AND created_at >= NOW() - INTERVAL '5 DAY';
样例数据返回结果
- 查询用户ID为1、金额为200、时间范围5天:
valid_days返回4,is_qualified返回false - 查询用户ID为2、金额为250、时间范围5天:
valid_days返回5,is_qualified返回true,完全符合需求。
其他数据库适配
如果使用MySQL,仅需调整时间条件的写法即可:
SELECT COUNT(DISTINCT DATE(created_at)) AS valid_days FROM transactions WHERE user_id = 1 AND currency = 'USD' AND amount = 200 AND created_at >= DATE_SUB(NOW(), INTERVAL 5 DAY);
内容的提问来源于stack exchange,提问作者Farhod Nematov
相关产品推荐
相关产品推荐

