查找分组中未遵循价格递减序列的SQL记录
需求与数据表
现有数据表如下:
| ID | Date | Rate Type | Price | Hierarchy |
|---|---|---|---|---|
| 1 | 18-10-2022 | R1 | 100 | 1 |
| 2 | 18-10-2022 | R2 | 90 | 2 |
| 4 | 18-10-2022 | R4 | 120 | 4 |
| 3 | 18-10-2022 | R3 | 80 | 3 |
| 5 | 18-10-2022 | R5 | 60 | 5 |
| 6 | 18-10-2022 | R6 | 50 | 6 |
| 7 | 19-10-2022 | R1 | 150 | 1 |
| 8 | 19-10-2022 | R2 | 120 | 2 |
| 9 | 19-10-2022 | R3 | 200 | 3 |
| 10 | 19-10-2022 | R4 | 180 | 4 |
| 11 | 19-10-2022 | R5 | 170 | 5 |
| 12 | 19-10-2022 | R6 | 110 | 6 |
需要筛选出按Date分组后,Hierarchy从1到6过程中价格未保持递减的记录。例如18-10-2022组的ID4,19-10-2022组的ID9、10、11。
实现方案
使用窗口函数LAG()追踪每组内的价格变化,标记并筛选不符合递减规则的记录:
WITH grouped_data AS ( SELECT *, -- 获取同组内上一个Hierarchy对应的价格 LAG(Price) OVER (PARTITION BY Date ORDER BY Hierarchy) AS prev_price, -- 累计标记分组内是否出现过价格上涨的情况 SUM(CASE WHEN Price > LAG(Price) OVER (PARTITION BY Date ORDER BY Hierarchy) THEN 1 ELSE 0 END) OVER (PARTITION BY Date ORDER BY Hierarchy ROWS UNBOUNDED PRECEDING) AS has_break FROM your_table WHERE Hierarchy BETWEEN 1 AND 6 ) SELECT ID, Date, `Rate Type`, Price, Hierarchy FROM grouped_data -- 筛选自身打破递减,或之前已出现打破的记录 WHERE has_break > 0;
输出结果
执行后将得到目标记录:
| ID | Date | Rate Type | Price | Hierarchy |
|---|---|---|---|---|
| 4 | 18-10-2022 | R4 | 120 | 4 |
| 9 | 19-10-2022 | R3 | 200 | 3 |
| 10 | 19-10-2022 | R4 | 180 | 4 |
| 11 | 19-10-2022 | R5 | 170 | 5 |
内容的提问来源于stack exchange,提问作者Rahul Vyas
相关产品推荐
相关产品推荐

