oracle - 聚合顺序的数字
问题描述
我有一个part_tab
带有列的表serial_no
:
PART_NO SERIAL_NO
A 1
A 2
A 3
A 5
A 7
A 8
A 9
A 10
当它们按顺序排列时,我想serial_no
在一行中聚合值:
PART_NO SERIAL_NO
A 1-3
A 5
A 7-10
分组是按part_no
。所以对于部件号“A”,我想serial_no
在一列中选择值“1-3”、“5”、“7-10”。所选列的范围应从最小值到最大值并按递增顺序排列。
解决方案
这是一个空白和孤岛问题,您可以通过对行编号并从序列号中减去这些数字来解决。这为您提供了所需的组。
select
part_no,
case when min(serial_no) = max(serial_no)
then to_char(min(serial_no))
else min(serial_no) || '-' || max(serial_no)
end as serial_nos
from
(
select
part_no,
serial_no,
serial_no - row_number() over (partition by part_no order by serial_no) as grp
from mytable
)
group by part_no, grp
order by part_no, min(serial_no);
推荐阅读
- java - 自动化 Spring Cloud Profile
- reactjs - 命名导出/未命名导出
- javascript - 无法从 Google App Script 中查看对象内的对象值
- php - 即使不在数组中,Twig 也会返回 true(选中字段)
- javascript - 如何在 Bootsrap 中使用多个列而不是从第 1 列开始?
- ios - 如何提高 CMSampleBuffer 中的音频速度
- python - 如何合并列表?(熊猫数据框)
- python - 对于所有缩放级别,将文本标签保持在与主轴相同的相对 x 位置,同时保持绝对 y 位置
- awk - 添加在 2 列中发现时间相同的新列
- csv - 使用 Pig Latin 计算唯一值的出现次数