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

Откуда:
Сообщений: 265
Здрасьте,

есть следующая исходная ситуация, я думаю типичная для страховок:
- некий список договоров
- у каждого договора есть несколько версий, у каждой версии есть дата "Действительно с..." D
- версии в общем случае не накладываются, хотя не уверен (существуют изменения "задним числом"). Рассматриваем случай, что не накладываются
- задан некий месяц М

Нужно выдать все версии договоров у которых D находится внутри M и дополнительно самая старшая версия с D < М (если такая есть).
Важно, что бы в результате вообще не упоминались договоры не имеющие версий в M

В голову приходят только трёхэтажные стэйтменты, с кучей subqueries в union-ах и возможно analytic functions.

Не хочется, поэтому ищу красивый SQL :-)
5 окт 18, 17:24    [21696651]     Ответить | Цитировать Сообщить модератору
 Re: Красивый SQL для "все записи за отчётный период + самая новая до этого периода"  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28286
Ответ тоже хочешь в эпистолярном виде?
5 окт 18, 17:52    [21696673]     Ответить | Цитировать Сообщить модератору
 Re: Красивый SQL для "все записи за отчётный период + самая новая до этого периода"  [new]
-2-
Member

Откуда:
Сообщений: 13851
Сергиус
В голову приходят только трёхэтажные стэйтменты, с кучей subqueries в union-ах и возможно analytic functions.
Достаточно одного подэтажа с аналитической функцией.
5 окт 18, 17:57    [21696677]     Ответить | Цитировать Сообщить модератору
 Re: Красивый SQL для "все записи за отчётный период + самая новая до этого периода"  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16776
-2-
Достаточно одного подэтажа с аналитической функцией.

Вообще у ТС есть (под)задачка на TOP-N.
Изложения вариантов полнее, чем у Саяна я еще не видел.
http://www.fors.ru/upload/magazine/07/http_text/russia_s.malakshinov_distinct_top.html
5 окт 18, 18:17    [21696694]     Ответить | Цитировать Сообщить модератору
 Re: Красивый SQL для "все записи за отчётный период + самая новая до этого периода"  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16776
andrey_anonymous
задачка на TOP-N.
Изложения вариантов полнее, чем у Саяна я еще не видел.

Сорри, не та ссылка.
Вот тут в комментах Саян свел местные обсуждения.
https://habr.com/post/269173/
А ссылка выше - про эффективные реализации, ессно.
5 окт 18, 18:40    [21696711]     Ответить | Цитировать Сообщить модератору
 Re: Красивый SQL для "все записи за отчётный период + самая новая до этого периода"  [new]
Сергиус
Member

Откуда:
Сообщений: 265
Здрасьте ещё раз,

не отвечал, бо был занят отдыхом ;-)

Вопрос всё ещё актуален. Отвечать можно, как предложили в зале, в поэтической форме, неким мета-sql. Я переведу, сразу на ассемблер ;-)

Я почитал линки из предыдущих постов, но это не совсем то. TOP N запросы я умею, проблема в том что здесь нет постоянного N для всех договоров. Я должен был указать на эту особенность сразу, поэтому исправляюсь:

- количество версий в месяце M может отличаться от договора к договору. Для одного это может быть одна (+ самая новая из предыдущего месяца), для другого 5 (+ самая новая из предыдущего месяца). Если у договора вообще нет версий в месяце M, то он не упоминается в результате.
8 окт 18, 11:02    [21697802]     Ответить | Цитировать Сообщить модератору
 Re: Красивый SQL для "все записи за отчётный период + самая новая до этого периода"  [new]
-2-
Member

Откуда:
Сообщений: 13851
Сергиус
здесь нет постоянного N для всех договоров.
"самая новая из предыдущего месяца" - это постоянное N=1
8 окт 18, 11:06    [21697805]     Ответить | Цитировать Сообщить модератору
 Re: Красивый SQL для "все записи за отчётный период + самая новая до этого периода"  [new]
Сергиус
Member

Откуда:
Сообщений: 265
-2-,

Ну да, правильно.

Пока мне в голову приходит только что-то вроде:

select всех договоров/версий в месяце М
union
( select rank всех версий в периоде < M, но для договоров указанных в select вверху)
where rank = 1

Получается достаточно громоздко
8 окт 18, 11:16    [21697815]     Ответить | Цитировать Сообщить модератору
 Re: Красивый SQL для "все записи за отчётный период + самая новая до этого периода"  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5142
Сергиус
количество версий в месяце M может отличаться от договора к договору. Для одного это может быть одна (+ самая новая из предыдущего месяца), для другого 5 (+ самая новая из предыдущего месяца). Если у договора вообще нет версий в месяце M, то он не упоминается в результате.

выбираем колонки
из (выборака аналитика в разрезе договоров макс_дата, остальное из таблицы где дата больше начала предыдущего месяца и меньше конца текущего месяца)
где макс_дата больше начала текущего месяца
группировка с кейсом

После группировки остаются все версии в текущем и последняя в предыдущем, для тех договоров у которых есть хоть одна в текущем.
Переводи. Если тебе лень даже написать имена колонок, то я не буду углубляться в детали.
8 окт 18, 13:27    [21698013]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить