如何用PostgreSQL实现按客户取最近3条统计值为0的记录数
PostgreSQL 按客户最近3条交易筛选实现方案
核心实现逻辑
- 首先对每个客户的交易记录按交易日期倒序排序,筛选出每个客户的最近3条交易
- 统计这3条记录中
Value等于0的条数 - 过滤出条数≥3的客户,再关联客户表获取客户的
Name等信息 - 如果同一个客户存在多条相同日期的交易,建议使用
ROW_NUMBER()而非RANK(),避免排名重复导致取到超过3条记录的问题
可直接运行的查询代码
WITH ranked_transactions AS ( -- 给每个客户的交易按日期倒序排名 SELECT Customer, Value, ROW_NUMBER() OVER (PARTITION BY Customer ORDER BY Date DESC) AS rn FROM 交易表 ), customer_zero_count AS ( -- 统计每个客户最近3条交易中Value=0的数量 SELECT Customer, COUNT(*) AS zero_count FROM ranked_transactions WHERE rn <= 3 AND Value = 0 GROUP BY Customer HAVING COUNT(*) >= 3 ) -- 关联客户表获取完整客户信息 SELECT c.Key AS 客户唯一标识, c.Name AS 客户名称, cz.zero_count AS 近3笔交易零值数量 FROM 客户表 c JOIN customer_zero_count cz ON c.Key = cz.Customer;
特殊场景适配说明
如果你的业务允许同一个客户相同日期的多条交易都算入最近3条统计范围,可以把
ROW_NUMBER()替换为RANK()或者DENSE_RANK(),根据实际业务规则调整即可。
内容的提问来源于stack exchange,提问作者Ademir Gomes
相关产品推荐
相关产品推荐

