Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как опредить интервалы номеров документов / 11 сообщений из 11, страница 1 из 1
30.04.2015, 13:01:38
    #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
30.04.2015, 13:09:30
    #38949624
Как опредить интервалы номеров документов
group by по разности между row_number() и doc_number
...
Рейтинг: 0 / 0
30.04.2015, 13:09:36
    #38949625
oragraf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как опредить интервалы номеров документов
Hibiscus,

start_of_group ищи
...
Рейтинг: 0 / 0
30.04.2015, 13:18:11
    #38949634
Hibiscus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как опредить интервалы номеров документов
Добрый Э - Эхgroup by по разности между row_number() и doc_number
Гениально! Я чувствовал что как-то можно! Но получалось только два-три раза обернув запросами.
А так - красота.
...
Рейтинг: 0 / 0
30.04.2015, 13:22:05
    #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
30.04.2015, 13:26:02
    #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
Период между сообщениями больше года.
29.06.2016, 10:56:53
    #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
29.06.2016, 11:07:08
    #39264503
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как опредить интервалы номеров документов
STFF start_of_group
...
Рейтинг: 0 / 0
29.06.2016, 11:16:11
    #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
29.06.2016, 11:19:07
    #39264512
мин мах
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как опредить интервалы номеров документов
Hibiscus,

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


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