SQL排序需求:按2022年损失排序并保持同部件两行关联
问题:按部件关联排序数据集,保持同部件两行数据相邻
- 数据集每个部件对应2行数据(分别为2021年、2022年记录),共16列
volume_loss字段仅2022年有数值,2021年该字段值始终为null- 需求:按2022年的
volume_loss降序排序整个数据集,同时保证每个部件的两行数据始终关联在一起
用户尝试使用
PARTITION BY实现,但未达到预期,代码如下:
SELECT *, ROW_NUMBER() OVER (PARTITION BY part ORDER BY volume_loss DESC) as [row_number] FROM DF
正确实现方式
要实现目标,核心是先为每个部件获取对应的2022年volume_loss值,再基于这个值对全量数据排序:
方法1:子查询关联获取排序键
SELECT df.* FROM DF df JOIN ( SELECT part, MAX(volume_loss) AS part_loss FROM DF GROUP BY part ) part_losses ON df.part = part_losses.part ORDER BY part_losses.part_loss DESC, df.year
- 子查询通过
MAX(volume_loss)提取每个部件的2022年loss值(2021年为null,MAX会自动取非空的2022年数据) - 主查询关联后,按部件的loss值降序排序,同部件的两行会自然相邻;最后按年份排序可固定2021/2022的显示顺序(可选)
方法2:窗口函数直接生成排序键
SELECT *, MAX(volume_loss) OVER (PARTITION BY part) AS part_loss FROM DF ORDER BY part_loss DESC, year
- 使用
MAX() OVER (PARTITION BY part)为每一行生成对应部件的2022年loss值 - 直接按生成的
part_loss降序排序,即可实现同部件行关联,同时整体按loss排序
内容的提问来源于stack exchange,提问作者L. Cruz
相关产品推荐
相关产品推荐

