You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用MySQL 8.0窗口函数将第一个表转换为第二个表?

问题描述

如何使用MySQL 8.0窗口函数查询将第一个表转换为第二个表?

记录按col1排序。对于col2,每条记录应保留最小值(1),直到遇到更大的值(10),之后所有记录都使用10,直到遇到更大的值(20),依此类推……

我尝试了窗口查询MIN(col2) OVER (ORDER BY col1),也试过ROW_NUMBER(),但都无法得到预期结果。

原始表

col1col2
11
31
1110
1210
151
2010
211
2220
2210
2520
2610

目标表

col1col2
11
31
1110
1210
1510
2010
2110
2210
2220
2520
2620
解决方案

你需要的是计算累积最大值,而非最小值。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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 09:47:38