Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / формирование диапазона из списка заначений / 25 сообщений из 26, страница 1 из 2
03.02.2020, 13:10
    #39921771
macleod1975
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
Все привет!
помогите сделать диапазон значений. Есть таблица t в которой указаны значения в поле t.num причем значения могут быть не по порядку
например t.num имеет значения
001,002,003,004,005,007,008,009,011,013,015,016,017,018,020

соответственно
001-005 5 шт
007-009 3 шт
011 1 шт
013 1 шт
015-020 5 шт.
...
Рейтинг: 0 / 0
03.02.2020, 13:16
    #39921772
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
STFF start_of_group
...
Рейтинг: 0 / 0
03.02.2020, 13:51
    #39921807
maglevdevice
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
macleod1975

015-020 5 шт.


Нет.
015 018 4 шт.
020 020 1 шт.
...
Рейтинг: 0 / 0
03.02.2020, 14:01
    #39921813
macleod1975
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
все верно. описался
...
Рейтинг: 0 / 0
03.02.2020, 14:51
    #39921840
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
with s(id) as (select * from table(sys.odcinumberlist(001,002,003,004,005,007,008,009,011,013,015,016,017,018,020)))
select *
from s
match_recognize (
order by id
measures match_number() as mn,
         first(id) first_id,
         last(id)  last_id
pattern (f v*)
define v as prev(id) = id - 1
);

        MN   FIRST_ID    LAST_ID
---------- ---------- ----------
         1          1          5
         2          7          9
         3         11         11
         4         13         13
         5         15         18
         6         20         20

6 rows selected
...
Рейтинг: 0 / 0
03.02.2020, 14:57
    #39921842
macleod1975
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
интересный вариант. Только в навигаторе, почему-то не работает..
...
Рейтинг: 0 / 0
03.02.2020, 15:07
    #39921848
macleod1975
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
AmKad,

Посмотрите, плс. Что-то в навигаторе не работает
...
Рейтинг: 0 / 0
03.02.2020, 15:17
    #39921857
merch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
macleod1975Посмотрите, плс. Что-то в навигаторе не работает

Вы какой используете? Яндекс или Гугл?
...
Рейтинг: 0 / 0
03.02.2020, 15:46
    #39921877
macleod1975
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
merch,
SQL Navigator 6.1 XPert Edition
...
Рейтинг: 0 / 0
03.02.2020, 15:51
    #39921882
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
macleod1975,
Все верно. Уровень навигатора
авторSQL Navigator 6.1 XPert Edition
не соотвествует уровню пользователя
...
Рейтинг: 0 / 0
03.02.2020, 15:54
    #39921883
macleod1975
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
123йй,
Что есть то есть...
...
Рейтинг: 0 / 0
03.02.2020, 16:55
    #39921919
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
macleod1975
123йй,
Что есть то есть...

версия оракля какая?

.....
stax
...
Рейтинг: 0 / 0
03.02.2020, 17:15
    #39921927
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
Elic
STFF start_of_group


Не нужен тут start_of_group:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
with t as (select '001,002,003,004,005,007,008,009,011,013,015,016,017,018,020' num from dual)
select  case min(n)
          when max(n) then min(n) || ' 1 cnt'
          else min(n) || ' - ' || max(n) || ' ' || count(*) || ' cnt'
        end ranges
  from  t,
        xmltable(
                 num
                 columns
                   n number path '.'
                )
  group by n - rownum
  order by n - rownum
/

RANGES
--------------------------------------------------------------------------------
1 - 5 5 cnt
7 - 9 3 cnt
11 1 cnt
13 1 cnt
15 - 18 4 cnt
20 1 cnt

6 rows selected.

SQL>



SY.
...
Рейтинг: 0 / 0
03.02.2020, 17:22
    #39921930
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
SY
Не нужен тут start_of_group:
Можешь каждый раз изголяться по новому.
...
Рейтинг: 0 / 0
03.02.2020, 17:25
    #39921931
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
AmKad,

У macleod1975 поле = '001,002,003,004,005,007,008,009,011,013,015,016,017,018,020' посему sys.odcinumberlist(001,002,003,004,005,007,008,009,011,013,015,016,017,018,020) еще получить надо. Т.е. придется значение поля разбить а если разбили то и sys.odcinumberlist не нужен.

SY.
...
Рейтинг: 0 / 0
03.02.2020, 17:31
    #39921932
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
Elic
SY
Не нужен тут start_of_group:
Можешь каждый раз изголяться по новому.


Зачем искать start_of_group, по нему вычислять group а затем group by, т.е. три итерации если можно одной?

SY.
...
Рейтинг: 0 / 0
03.02.2020, 17:36
    #39921935
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
SY
Зачем искать start_of_group, по нему вычислять group а затем group by, т.е. три итерации если можно одной?
А с чего ты вообще взял, что у него одна строка?
...
Рейтинг: 0 / 0
03.02.2020, 18:10
    #39921952
merch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
ElicМожешь каждый раз изголяться по новому.


по-новому.
...
Рейтинг: 0 / 0
03.02.2020, 18:32
    #39921972
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
Elic
А с чего ты вообще взял, что у него одна строка?


Ну и в чем проблема? ROWID + ordinality:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
SQL> select * from t
  2  /

NUM
-----------------------------------------------------------
001,002,003,004,005,007,008,009,011,013,015,016,017,018,020
6,10,12,14,19

SQL> select  case min(n)
          when max(n) then min(n) || ' 1 cnt'
          else min(n) || ' - ' || max(n) || ' ' || count(*) || ' cnt'
        end ranges
  from  t,
        xmltable(
                 num
                 columns
                   n number path '.',
                   r for ordinality
                )
  group by rowid,n - r
  order by rowid,n - r
/

RANGES
--------------------------------------------------------------------------------------------------------------------------------
1 - 5 5 cnt
7 - 9 3 cnt
11 1 cnt
13 1 cnt
15 - 18 4 cnt
20 1 cnt
6 1 cnt
10 1 cnt
12 1 cnt
14 1 cnt
19 1 cnt

11 rows selected.

SQL>



Ну и конечно дпилить если числа не обязательно идут по возрастанию и/или возможны дубли.

SY.
...
Рейтинг: 0 / 0
03.02.2020, 18:42
    #39921981
chidoriami
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
еще вариант - аналитикой
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
with s(id) as (select * from table(sys.odcinumberlist(001,002,003,004,005,007,008,009,011,013,015,016,017,018,020)))
, modif_s as (
    select
            id
           ,lag(ID)  over (order by id)  prev_id
      from s
)
select 
        min(id) group_start
       ,max(id) group_end
  from (
        select 
                id
               ,sum(is_start_of_group) over (order by id)   group_num
          from (
                select id
                       ,case when id - 1 = prev_id
                             then 0
                             else 1
                        end
                            is_start_of_group
                  from modif_s
               )
         where 1=1
       )
 group by group_num
 order by 1
...
Рейтинг: 0 / 0
03.02.2020, 18:59
    #39921995
chidoriami
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
SY,

SY
Код: plsql
1.
2.
3.
4.
5.
select  min(n)
       ,max(n)
  from  s
  group by n - rownum
  order by n - rownum




это прям круто! мне в голову не пришло)
...
Рейтинг: 0 / 0
04.02.2020, 04:13
    #39922101
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
chidoriami
это прям круто! мне в голову не пришло)
а решение , тем временем, старо, как мир...
...
Рейтинг: 0 / 0
04.02.2020, 07:29
    #39922113
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
SY
Elic
А с чего ты вообще взял, что у него одна строка?
Ну и в чем проблема?
Соломон, пора бы уже сняться с ручника.
SY
У macleod1975 поле = '001,002,003,004,005,007,008,009,011,013,015,016,017,018,020'
Это тебе лишь показалось. А ты на этом развил бурную изобличающую деятельность.
...
Рейтинг: 0 / 0
04.02.2020, 09:16
    #39922135
macleod1975
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
Супер! Спасибо огромное" помогли!!!
...
Рейтинг: 0 / 0
04.02.2020, 18:00
    #39922439
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
формирование диапазона из списка заначений
Elic
А ты на этом развил бурную изобличающую деятельность.


Даже если NUM это одно число вычисление start-of-group не нужнo. Достаточно DENSE_RANK чтобы вычислить группу:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with s(id) as (select * from table(sys.odcinumberlist(001,002,003,004,005,007,008,009,011,013,015,016,017,018,020))),
t as (select id,id - dense_rank() over(order by id) grp from s)
select  case min(id)
          when max(id) then min(id) || ' 1 cnt'
          else min(id) || ' - ' || max(id) || ' ' || count(*) || ' cnt'
        end ranges
  from  t
  group by grp
  order by grp
/

RANGES
--------------------------------------------------------------------------------------------------------------------------------
1 - 5 5 cnt
7 - 9 3 cnt
11 1 cnt
13 1 cnt
15 - 18 4 cnt
20 1 cnt

6 rows selected.

SQL>




Ну и MATCH_RECOGNIZE если 12C.

SY.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / формирование диапазона из списка заначений / 25 сообщений из 26, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]