将非连续数字集划分为特定的组,并在oracle数据库中作为行返回

时间:2018-09-19 19:33:10

标签: sql oracle oracle11g

我有一个包含非序列号的数据库列。说1 3 5 8 13 15 16 17 20 23 34 5468。我想将它们分成3个数字的组(相等范围内的分隔系数为3)。如何获得以下范围值?

enter image description here

1 个答案:

答案 0 :(得分:2)

在这里。

在WITH子句中,创建测试数据。如果您不了解它的作用,请不要担心。它仅创建一个具有单列COL的视图输入,其中包含您提供的要测试的值。实际查询(解决方案)在WITH子句之后开始。要对其进行测试,请删除有关从INPUTS中进行选择的注释行之前的所有内容。

with
  inputs(col) as (
    select column_value 
    from   sys.odcinumberlist(1,3,5,8,13,15,16,17,20,23,34,54,68)
  )
-- select * from inputs; */
select   row_num, min(col) as start_range, max(col) as end_range
from     (
           select col
                , least( ceil(row_number() over (order by col)/3), 
                         trunc(count(*) over () / 3)
                       ) as row_num
           from   inputs
         )
group by row_num
order by row_num
;

   ROW_NUM START_RANGE  END_RANGE
---------- ----------- ----------
         1           1          5
         2           8         15
         3          16         20
         4          23         68