Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как опредить интервалы номеров документов  [new]
Hibiscus
Member

Откуда: Москва
Сообщений: 66
Добрый день.

Есть таблица
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_to
22 'FFF' '32' '34'
22 'FFF' '52' '53'
22 'FFF' '55' '55'
22 'FFF' '61' '64'
30 апр 15, 13:01    [17586637]     Ответить | Цитировать Сообщить модератору
 Re: Как опредить интервалы номеров документов  [new]
Добрый Э - Эх
Guest
group by по разности между row_number() и doc_number
30 апр 15, 13:09    [17586697]     Ответить | Цитировать Сообщить модератору
 Re: Как опредить интервалы номеров документов  [new]
oragraf
Member

Откуда: Moscow
Сообщений: 1312
Hibiscus,

start_of_group ищи
30 апр 15, 13:09    [17586698]     Ответить | Цитировать Сообщить модератору
 Re: Как опредить интервалы номеров документов  [new]
Hibiscus
Member

Откуда: Москва
Сообщений: 66
Добрый Э - Эх
group by по разности между row_number() и doc_number

Гениально! Я чувствовал что как-то можно! Но получалось только два-три раза обернув запросами.
А так - красота.
30 апр 15, 13:18    [17586762]     Ответить | Цитировать Сообщить модератору
 Re: Как опредить интервалы номеров документов  [new]
Добрый Э - Эх
Guest
Hibiscus
Но получалось только два-три раза обернув запросами.
А так - красота.
Ну, один-то раз все же обернуть придется...
--
-- Тестовые данные:
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
30 апр 15, 13:22    [17586793]     Ответить | Цитировать Сообщить модератору
 Re: Как опредить интервалы номеров документов  [new]
Hibiscus
Member

Откуда: Москва
Сообщений: 66
Добрый Э - Эх
Hibiscus
Но получалось только два-три раза обернув запросами.
А так - красота.
Ну, один-то раз все же обернуть придется...
--
-- Тестовые данные:
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
30 апр 15, 13:26    [17586845]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как опредить интервалы номеров документов  [new]
Hibiscus
Member

Откуда: Москва
Сообщений: 66
Внезапно снова понадобилась выбрать непрерывные интервалы, но текущее решение не совсем подошло. так как усложнились требования:

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_to
12311
522
12335
566


Можете что-нибудь подсказать ?
29 июн 16, 10:56    [19348872]     Ответить | Цитировать Сообщить модератору
 Re: Как опредить интервалы номеров документов  [new]
Elic
Member

Откуда:
Сообщений: 29976
STFF start_of_group
29 июн 16, 11:07    [19348917]     Ответить | Цитировать Сообщить модератору
 Re: Как опредить интервалы номеров документов  [new]
Добрый Э - Эх
Guest
Hibiscus,

а какие сложности? всё ровно тоже самое:
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);
29 июн 16, 11:16    [19348968]     Ответить | Цитировать Сообщить модератору
 Re: Как опредить интервалы номеров документов  [new]
мин мах
Guest
Hibiscus,

group by user_id, npp - row_number() over(p.by user_id o.by npp)
29 июн 16, 11:19    [19348978]     Ответить | Цитировать Сообщить модератору
 Re: Как опредить интервалы номеров документов  [new]
Hibiscus
Member

Откуда: Москва
Сообщений: 66
Спасибо.
Заработался видимо.
Смотрел только на поле grp_id, оно получалось не уникальным и я печально думал, что запрос не работает
29 июн 16, 12:41    [19349443]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить