sql - 通过记录之间的相对差异查找数据中的组
问题描述
我有一些按价格排序的行:
| 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 时组开始是一致的。您可以使用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
推荐阅读
- python - 如何在并行进程(python-asyncio)中将项目附加到列表中?
- php - 我们计算的请求签名与您提供的签名不匹配。在 php 中检查您的 AWS 秘密访问密钥和签名方法
- php - 发布新产品时如何获取 woocommerce 产品的所有详细信息?
- r - 有没有办法从 shinyapp.io 链接找到 R 代码?
- c++ - xcode 13 无法编译某些函数 c++
- python - 使用类中的函数关闭弹出窗口(kivy)
- sql - 有没有办法在忽略 Spring Boot 中的外键检查的同时截断表?
- anylogic - 步行图书馆的资源可用性
- node.js - 为什么我的服务器在尝试安装 SCSS 后停止工作?
- c - 由于使用指向结构的指针的函数,for 循环意外中断