powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как опредить интервалы номеров документов
11 сообщений из 11, страница 1 из 1
Как опредить интервалы номеров документов
    #38949610
Hibiscus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Есть таблица
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create table docs(id number, doctype number, doc_serial varchar2(10), doc_number varchar2(10));
insert into docs
select 1, 22, 'FFF', '0032' from dual union all
select 2, 22, 'FFF', '0033' from dual union all
select 3, 22, 'FFF', '0034' from dual union all
select 4, 22, 'FFF', '0052' from dual union all
select 5, 22, 'FFF', '0053' from dual union all
select 6, 22, 'FFF', '0055' from dual union all
select 7, 22, 'FFF', '0061' from dual union all
select 8, 22, 'FFF', '0062' from dual union all
select 9, 22, 'FFF', '0063' from dual union all
select 10, 22, 'FFF', '0064' from dual;


Необходимо вывести для каждого типа и серии поля "Номер с", "Номер по" значения которых отличается на 1. Т.е должно получиться что-то вроде этого:
typeserialnum_from num_to22 'FFF' '32' '34'22 'FFF' '52' '53'22 'FFF' '55' '55'22 'FFF' '61' '64'
...
Рейтинг: 0 / 0
Как опредить интервалы номеров документов
    #38949624
group by по разности между row_number() и doc_number
...
Рейтинг: 0 / 0
Как опредить интервалы номеров документов
    #38949625
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hibiscus,

start_of_group ищи
...
Рейтинг: 0 / 0
Как опредить интервалы номеров документов
    #38949634
Hibiscus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эхgroup by по разности между row_number() и doc_number
Гениально! Я чувствовал что как-то можно! Но получалось только два-три раза обернув запросами.
А так - красота.
...
Рейтинг: 0 / 0
Как опредить интервалы номеров документов
    #38949640
HibiscusНо получалось только два-три раза обернув запросами.
А так - красота.Ну, один-то раз все же обернуть придется...
Код: 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.
--
-- Тестовые данные:
with
  t (id, doctype, doc_serial, doc_number) as 
    (
      select 1, 22, 'FFF', '0032' from dual union all
      select 2, 22, 'FFF', '0033' from dual union all
      select 3, 22, 'FFF', '0034' from dual union all
      select 4, 22, 'FFF', '0052' from dual union all
      select 5, 22, 'FFF', '0053' from dual union all
      select 6, 22, 'FFF', '0055' from dual union all
      select 7, 22, 'FFF', '0061' from dual union all
      select 8, 22, 'FFF', '0062' from dual union all
      select 9, 22, 'FFF', '0063' from dual union all
      select 10, 22, 'FFF', '0064' from dual
    )
--
-- Основной запрос:
select doctype, doc_serial, min(doc_number) as num_from, max(doc_number) as num_to
  from (
         select doctype, doc_serial, doc_number,
                row_number() over(order by doc_number) - to_number(doc_number) as grp_id
           from t
       ) v
 group by doctype, doc_serial, grp_id
 order by num_from
...
Рейтинг: 0 / 0
Как опредить интервалы номеров документов
    #38949647
Hibiscus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - ЭхHibiscusНо получалось только два-три раза обернув запросами.
А так - красота.Ну, один-то раз все же обернуть придется...
Код: 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.
--
-- Тестовые данные:
with
  t (id, doctype, doc_serial, doc_number) as 
    (
      select 1, 22, 'FFF', '0032' from dual union all
      select 2, 22, 'FFF', '0033' from dual union all
      select 3, 22, 'FFF', '0034' from dual union all
      select 4, 22, 'FFF', '0052' from dual union all
      select 5, 22, 'FFF', '0053' from dual union all
      select 6, 22, 'FFF', '0055' from dual union all
      select 7, 22, 'FFF', '0061' from dual union all
      select 8, 22, 'FFF', '0062' from dual union all
      select 9, 22, 'FFF', '0063' from dual union all
      select 10, 22, 'FFF', '0064' from dual
    )
--
-- Основной запрос:
select doctype, doc_serial, min(doc_number) as num_from, max(doc_number) as num_to
  from (
         select doctype, doc_serial, doc_number,
                row_number() over(order by doc_number) - to_number(doc_number) as grp_id
           from t
       ) v
 group by doctype, doc_serial, grp_id
 order by num_from



В row_number() надо будет еще partition by добавить, но это моя вина - в тестовом примере только один doctype и один doc_serial
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как опредить интервалы номеров документов
    #39264494
Hibiscus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Внезапно снова понадобилась выбрать непрерывные интервалы, но текущее решение не совсем подошло. так как усложнились требования:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with tab
     as (select 119203 doc_id, 1809 doc_spec_id, 123 user_id, 1 npp from dual
         union all
         select 119203 doc_id, 1810 doc_spec_id, 5 user_id, 2 npp from dual
         union all
         select 119203 doc_id, 1811 doc_spec_id, 123 user_id, 3 npp from dual
         union all
         select 119203 doc_id, 1812 doc_spec_id, 123 user_id, 4 npp from dual
         union all
         select 119203 doc_id, 1813 doc_spec_id, 123 user_id, 5 npp from dual
         union all
         select 119203 doc_id, 1814 doc_spec_id, 5 user_id, 6 npp from dual)
select *
  from tab;



Потребовалось получить USER_ID и интервалы NPP где NPP возрастает непрерывно. Сложность оказалась в том, что user_id может повторяться и partition by по нему дает неверный результат. Желаемый результат:
user_idnpp_fromnpp_to1231152212335566

Можете что-нибудь подсказать ?
...
Рейтинг: 0 / 0
Как опредить интервалы номеров документов
    #39264503
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
STFF start_of_group
...
Рейтинг: 0 / 0
Как опредить интервалы номеров документов
    #39264510
Hibiscus,

а какие сложности? всё ровно тоже самое:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with tab
     as (select 119203 doc_id, 1809 doc_spec_id, 123 user_id, 1 npp from dual
         union all
         select 119203 doc_id, 1810 doc_spec_id, 5 user_id, 2 npp from dual
         union all
         select 119203 doc_id, 1811 doc_spec_id, 123 user_id, 3 npp from dual
         union all
         select 119203 doc_id, 1812 doc_spec_id, 123 user_id, 4 npp from dual
         union all
         select 119203 doc_id, 1813 doc_spec_id, 123 user_id, 5 npp from dual
         union all
         select 119203 doc_id, 1814 doc_spec_id, 5 user_id, 6 npp from dual)

select user_id, min(npp) npp_from, max(npp) npp_to
  from (
         select t.*, row_number() over(partition by user_id order by npp) - npp as grp_id
           from tab t
       )
  group by user_id, grp_id
  order by min(npp);
...
Рейтинг: 0 / 0
Как опредить интервалы номеров документов
    #39264512
мин мах
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hibiscus,

group by user_id, npp - row_number() over(p.by user_id o.by npp)
...
Рейтинг: 0 / 0
Как опредить интервалы номеров документов
    #39264603
Hibiscus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.
Заработался видимо.
Смотрел только на поле grp_id, оно получалось не уникальным и я печально думал, что запрос не работает
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как опредить интервалы номеров документов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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