PostgreSQL:按账户分组筛选金额差值小于5的唯一ID
PostgreSQL分组筛选:获取组内金额差值小于5的唯一ID
先把你的数据整理成更直观的表格:
| id | account | amount |
|---|---|---|
| 123 | abc | 10 |
| 1234 | abc | 12 |
| 4568 | abc | 16 |
| 456 | def | 20 |
| 458 | def | 30 |
根据你的需求——按account分组,筛选出组内存在至少一个其他记录与自身金额差值小于5的唯一id,这里有个直接可行的SQL方案:
SELECT DISTINCT t1.id FROM your_table t1 INNER JOIN your_table t2 ON t1.account = t2.account AND t1.id != t2.id WHERE ABS(t1.amount - t2.amount) < 5;
思路拆解
- 自连接匹配同组记录:通过将表与自身连接,把每个记录和同
account下的其他记录做对比,t1.id != t2.id是为了避免记录和自身无效比较。 - 筛选差值条件:用
ABS()计算金额差的绝对值,确保不管金额谁大谁小,只要差值小于5就符合要求。 - 去重得到唯一ID:符合条件的记录可能会被多次匹配(比如123会和1234匹配,1234也会和123匹配),所以用
DISTINCT保证每个id只输出一次。
运行这个查询后,你会得到预期的结果:123、1234、4568。而def组的两个记录金额差为10,不满足条件,所以不会被包含进来。
内容的提问来源于stack exchange,提问作者umakant
相关产品推荐
相关产品推荐

