首页 > 解决方案 > 聚合顺序的数字

问题描述

我有一个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”。所选列的范围应从最小值到最大值并按递增顺序排列。

标签: oracleplsqlgaps-and-islands

解决方案


这是一个空白和孤岛问题,您可以通过对行编号并从序列号中减去这些数字来解决。这为您提供了所需的组。

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);

推荐阅读