按ID分组选取每组前两行并转换为新旧值格式
分组提取每组前两行并转换字段的SQL解决方案
输入数据表
| ID | Value |
|---|---|
| 12345 | 123.78 |
| 12345 | 556.87 |
| 12345 | 1638.09 |
| 12345 | 133.44 |
| 56789 | 44 |
| 56789 | 434.2 |
| 56789 | 24.44 |
目标输出
| ID | New Value | Old Value |
|---|---|---|
| 12345 | 123.78 | 556.87 |
| 56789 | 44 | 434.2 |
实现SQL
SELECT ID, MAX(CASE WHEN rn = 1 THEN Value END) AS `New Value`, MAX(CASE WHEN rn = 2 THEN Value END) AS `Old Value` FROM ( SELECT ID, Value, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Value) AS rn FROM your_table_name ) t WHERE rn <= 2 GROUP BY ID;
关键说明
- 子查询通过
ROW_NUMBER()窗口函数,按ID分组后给每组内的记录生成行号rn,排序规则默认按Value升序;若需按插入顺序或其他规则调整,可替换ORDER BY Value为对应字段(如时间戳)。 - 外层用条件聚合,分别提取行号为1和2的
Value值,映射为New Value和Old Value,最后按ID分组汇总得到目标结果。
内容的提问来源于stack exchange,提问作者Andrew Pike
相关产品推荐
相关产品推荐

