powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / формирование диапазона из списка заначений
25 сообщений из 26, страница 1 из 2
формирование диапазона из списка заначений
    #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
формирование диапазона из списка заначений
    #39921772
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
STFF start_of_group
...
Рейтинг: 0 / 0
формирование диапазона из списка заначений
    #39921807
maglevdevice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
macleod1975

015-020 5 шт.


Нет.
015 018 4 шт.
020 020 1 шт.
...
Рейтинг: 0 / 0
формирование диапазона из списка заначений
    #39921813
macleod1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
все верно. описался
...
Рейтинг: 0 / 0
формирование диапазона из списка заначений
    #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
формирование диапазона из списка заначений
    #39921842
macleod1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
интересный вариант. Только в навигаторе, почему-то не работает..
...
Рейтинг: 0 / 0
формирование диапазона из списка заначений
    #39921848
macleod1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AmKad,

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

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

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

.....
stax
...
Рейтинг: 0 / 0
формирование диапазона из списка заначений
    #39921927
Фотография 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
формирование диапазона из списка заначений
    #39921930
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
Не нужен тут start_of_group:
Можешь каждый раз изголяться по новому.
...
Рейтинг: 0 / 0
формирование диапазона из списка заначений
    #39921931
Фотография 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
формирование диапазона из списка заначений
    #39921932
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
SY
Не нужен тут start_of_group:
Можешь каждый раз изголяться по новому.


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

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


по-новому.
...
Рейтинг: 0 / 0
формирование диапазона из списка заначений
    #39921972
Фотография 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
формирование диапазона из списка заначений
    #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
формирование диапазона из списка заначений
    #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
формирование диапазона из списка заначений
    #39922101
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chidoriami
это прям круто! мне в голову не пришло)
а решение , тем временем, старо, как мир...
...
Рейтинг: 0 / 0
формирование диапазона из списка заначений
    #39922113
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
Elic
А с чего ты вообще взял, что у него одна строка?
Ну и в чем проблема?
Соломон, пора бы уже сняться с ручника.
SY
У macleod1975 поле = '001,002,003,004,005,007,008,009,011,013,015,016,017,018,020'
Это тебе лишь показалось. А ты на этом развил бурную изобличающую деятельность.
...
Рейтинг: 0 / 0
формирование диапазона из списка заначений
    #39922135
macleod1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Супер! Спасибо огромное" помогли!!!
...
Рейтинг: 0 / 0
формирование диапазона из списка заначений
    #39922439
Фотография 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
25 сообщений из 26, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / формирование диапазона из списка заначений
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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