如何用MySQL 8.0窗口函数将第一个表转换为第二个表?
问题描述
如何使用MySQL 8.0窗口函数查询将第一个表转换为第二个表?
记录按col1排序。对于col2,每条记录应保留最小值(1),直到遇到更大的值(10),之后所有记录都使用10,直到遇到更大的值(20),依此类推……
我尝试了窗口查询MIN(col2) OVER (ORDER BY col1),也试过ROW_NUMBER(),但都无法得到预期结果。
原始表
| col1 | col2 |
|---|---|
| 1 | 1 |
| 3 | 1 |
| 11 | 10 |
| 12 | 10 |
| 15 | 1 |
| 20 | 10 |
| 21 | 1 |
| 22 | 20 |
| 22 | 10 |
| 25 | 20 |
| 26 | 10 |
目标表
| col1 | col2 |
|---|---|
| 1 | 1 |
| 3 | 1 |
| 11 | 10 |
| 12 | 10 |
| 15 | 10 |
| 20 | 10 |
| 21 | 10 |
| 22 | 10 |
| 22 | 20 |
| 25 | 20 |
| 26 | 20 |
解决方案
你需要的是计算累积最大值,而非最小值。MySQL 8.0的窗口函数MAX()结合ORDER BY即可实现需求——默认窗口范围是从结果集起始行到当前行,正好匹配"遇到更大值后保留该值,直至下一个更大值出现"的规则。
实现SQL
SELECT col1, MAX(col2) OVER (ORDER BY col1) AS col2 FROM your_table;
逻辑说明
- 前两条记录
col2为1,累积最大值是1,与目标一致; - 第三条遇到10,累积最大值更新为10,后续所有记录直到出现20前,都保持10;
- 第八条遇到20,累积最大值更新为20,之后的记录均保留20,完全匹配目标结果。
你之前用MIN(col2)方向错误,因为需求是保留到当前行为止的最大值,而非最小值。
内容的提问来源于stack exchange,提问作者grimdbx
相关产品推荐
相关产品推荐

