首页 > 解决方案 > 通过记录之间的相对差异查找数据中的组

问题描述

我有一些按价格排序的行:

| id | price |
|----|-------|
|  1 |  2.00 |
|  2 |  2.10 |
|  3 |  2.11 |
|  4 |  2.50 |
|  5 |  2.99 |
|  6 |  3.02 |
|  7 |  9.01 |
|  8 |  9.10 |
|  9 |  9.11 |
| 10 | 13.01 |
| 11 | 13.51 |
| 12 | 14.10 |

我需要将它们分组到“价格组”中。当一个项目与前一个项目之间的价格差异大于某个固定值时,该项目属于不同的组,例如1.50

所以预期的结果是这样的:

| MIN(price) | MAX(price) | 
|------------|------------|
|       2.00 |       3.02 |
|       9.01 |       9.11 |
|      13.01 |      14.10 |

我什至不确定如何调用这种类型的分组。按“滚动差异”分组?不完全是...

这可以在 SQL(或特别是 Postgres)中完成吗?

标签: sqlpostgresqlaggregate-functions

解决方案


您的结果与查看先前的值并说当差值大于 1.5 时组开始是一致的。您可以使用lag()、累积总和和聚合来执行此操作:

select min(price), max(price)
from (select t.*,
             count(*) filter (where prev_price is null or prev_price < price - 1.5) over (order by price) as grp
      from (select t.*,
                   lag(price) over (order by price) as prev_price
            from t
           ) t
     ) t
group by grp

推荐阅读