powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Красивый SQL для "все записи за отчётный период + самая новая до этого периода"
9 сообщений из 9, страница 1 из 1
Красивый SQL для "все записи за отчётный период + самая новая до этого периода"
    #39713756
Сергиус
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здрасьте,

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

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

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

Не хочется, поэтому ищу красивый SQL :-)
...
Рейтинг: 0 / 0
Красивый SQL для "все записи за отчётный период + самая новая до этого периода"
    #39713771
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ответ тоже хочешь в эпистолярном виде?
...
Рейтинг: 0 / 0
Красивый SQL для "все записи за отчётный период + самая новая до этого периода"
    #39713773
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СергиусВ голову приходят только трёхэтажные стэйтменты, с кучей subqueries в union-ах и возможно analytic functions. Достаточно одного подэтажа с аналитической функцией.
...
Рейтинг: 0 / 0
Красивый SQL для "все записи за отчётный период + самая новая до этого периода"
    #39713783
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Достаточно одного подэтажа с аналитической функцией.
Вообще у ТС есть (под)задачка на TOP-N.
Изложения вариантов полнее, чем у Саяна я еще не видел.
http://www.fors.ru/upload/magazine/07/http_text/russia_s.malakshinov_distinct_top.html
...
Рейтинг: 0 / 0
Красивый SQL для "все записи за отчётный период + самая новая до этого периода"
    #39713788
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousзадачка на TOP-N.
Изложения вариантов полнее, чем у Саяна я еще не видел.
Сорри, не та ссылка.
Вот тут в комментах Саян свел местные обсуждения.
https://habr.com/post/269173/
А ссылка выше - про эффективные реализации, ессно.
...
Рейтинг: 0 / 0
Красивый SQL для "все записи за отчётный период + самая новая до этого периода"
    #39714286
Сергиус
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здрасьте ещё раз,

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

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

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

- количество версий в месяце M может отличаться от договора к договору. Для одного это может быть одна (+ самая новая из предыдущего месяца), для другого 5 (+ самая новая из предыдущего месяца). Если у договора вообще нет версий в месяце M, то он не упоминается в результате.
...
Рейтинг: 0 / 0
Красивый SQL для "все записи за отчётный период + самая новая до этого периода"
    #39714289
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергиусздесь нет постоянного N для всех договоров."самая новая из предыдущего месяца" - это постоянное N=1
...
Рейтинг: 0 / 0
Красивый SQL для "все записи за отчётный период + самая новая до этого периода"
    #39714295
Сергиус
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-,

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

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

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

Получается достаточно громоздко
...
Рейтинг: 0 / 0
Красивый SQL для "все записи за отчётный период + самая новая до этого периода"
    #39714377
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергиусколичество версий в месяце M может отличаться от договора к договору. Для одного это может быть одна (+ самая новая из предыдущего месяца), для другого 5 (+ самая новая из предыдущего месяца). Если у договора вообще нет версий в месяце M, то он не упоминается в результате.
Код: plaintext
1.
2.
3.
выбираем колонки
из (выборака аналитика в разрезе договоров макс_дата, остальное из таблицы где дата больше начала предыдущего месяца и меньше конца текущего месяца)
где макс_дата больше начала текущего месяца
группировка с кейсом

После группировки остаются все версии в текущем и последняя в предыдущем, для тех договоров у которых есть хоть одна в текущем.
Переводи. Если тебе лень даже написать имена колонок, то я не буду углубляться в детали.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Красивый SQL для "все записи за отчётный период + самая новая до этого периода"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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