Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 通过记录之间的相对差异查找数据中的组_Sql_Postgresql_Aggregate Functions - Fatal编程技术网

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 以新集团结束 从…起 选择*, 按价格比订单的价格滞后于上一价格 从价格 如注释所示 作为可分组的 结果 按结果分组 按结果排序。第一组;