Sql 通过记录之间的相对差异查找数据中的组
我有一些按价格排序的行:Sql 通过记录之间的相对差异查找数据中的组,sql,postgresql,aggregate-functions,Sql,Postgresql,Aggregate Functions,我有一些按价格排序的行: | 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 | 我需要把它们分成价格组。当一个项目和前一个项目之间的
| 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中实现吗?您的结果与查看上一个值并说当差值大于1.5时,组开始运行是一致的。您可以通过滞后、累积和和聚合来实现这一点:
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
谢谢戈登·林诺夫,这正是我想要的
我在这里使用这个查询只是因为我更了解它。我想这更像是努比,但我也是
这两个查询在大约一秒钟内将一个包含1M行的表分成34组。这个查询在1100万行上更有效,在15秒内将它们分成380个组,而Gordon的答案是23秒
选择results.group_i、MINresults.price、MAXresults.price、AVGresults.price
从…起
选择*,
SUMnew_group覆盖无界前一行和当前行之间的行,作为group_i
从…起
选择带注释的。*,
案例
当prev_price为空或price-prev_price>1.5时,则为1
其他0
以新集团结束
从…起
选择*,
按价格比订单的价格滞后于上一价格
从价格
如注释所示
作为可分组的
结果
按结果分组
按结果排序。第一组;