Чтобы найти начальную и конечную точки в последовательности - PullRequest
0 голосов
/ 01 февраля 2020

У меня есть таблица (T1) с одним столбцом (C1) со следующими значениями

1
2
3
5
6
8
9
10

Я хочу, чтобы вывод выводил непрерывные последовательности с начальной и конечной точками, как показано ниже.

1-3
5-6
8-10

Не могли бы вы помочь?

Все базы данных в порядке.

Ответы [ 3 ]

4 голосов
/ 01 февраля 2020

Oracle: сначала пример данных, в то время как код, который вам действительно нужен, начинается со строки № 11.

SQL> with t1 (c1) as
  2    (select 1 from dual union all
  3     select 2 from dual union all
  4     select 3 from dual union all
  5     select 5 from dual union all
  6     select 6 from dual union all
  7     select 8 from dual union all
  8     select 9 from dual union all
  9     select 10 from dual
 10    )
 11  select min(c1), max(c1)
 12  from (select c1, c1 - row_number() over (order by c1) rn
 13        from t1
 14       )
 15  group by rn
 16  order by rn;

   MIN(C1)    MAX(C1)
---------- ----------
         1          3
         5          6
         8         10

SQL>
3 голосов
/ 01 февраля 2020

Вы можете использовать следующий запрос. Я протестировал его на SQL сервере, но думаю, что он будет работать без изменений в Oracle:

create table t1(c1 int);

insert into t1
 select *
   from (values(1),(2),(3),(5),(6),(8),(9),(10))t(x);

select case when count(*) >1 then 
             concat(min(c1),'-',max(c1)) 
            else concat(max(c1),'')
        end as concat_cs
from (
        select c1
               ,ROW_NUMBER() over(order by c1 asc)  as rnk
               ,c1 - ROW_NUMBER() over(order by c1 asc) as grp
          from t1
     )x
group by x.grp

Вывод

concat_cs
1-3
5-6
8-10
0 голосов
/ 01 февраля 2020
with stab as (
   select 1 as val from dual union all
   select 2 as val from dual union all 
   select 3 as val from dual union all
   select 5 as val from dual union all 
   select 6 as val from dual union all 
   select 8 as val from dual union all 
   select 9 as val from dual union all 
   select 10 as val from dual union all 
   select 13 as val from dual union all 
   select 15 as val from dual union all 
   select 16 as val from dual union all 
   select 17 as val from dual union all 
   select 18 as val from dual union all 
   select 19 as val from dual union all 
   select 23 as val from dual 
),sq2 as(
  select 
    row_number() over(order by 1) as rownumber,val
  from stab
)
  select 
    a.val,b.val
  from sq2 A
  join sq2 b on b.rownumber  = a.rownumber+2 
  where mod(A.rownumber,3)=1

Выход:


         1          3
         5          8
         9         13
        15         17
        18         23

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...