|
|
|
Красивый SQL для "все записи за отчётный период + самая новая до этого периода"
|
|||
|---|---|---|---|
|
#18+
Здрасьте, есть следующая исходная ситуация, я думаю типичная для страховок: - некий список договоров - у каждого договора есть несколько версий, у каждой версии есть дата "Действительно с..." D - версии в общем случае не накладываются, хотя не уверен (существуют изменения "задним числом"). Рассматриваем случай, что не накладываются - задан некий месяц М Нужно выдать все версии договоров у которых D находится внутри M и дополнительно самая старшая версия с D < М (если такая есть). Важно, что бы в результате вообще не упоминались договоры не имеющие версий в M В голову приходят только трёхэтажные стэйтменты, с кучей subqueries в union-ах и возможно analytic functions. Не хочется, поэтому ищу красивый SQL :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2018, 17:24 |
|
||
|
Красивый SQL для "все записи за отчётный период + самая новая до этого периода"
|
|||
|---|---|---|---|
|
#18+
Ответ тоже хочешь в эпистолярном виде? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2018, 17:52 |
|
||
|
Красивый SQL для "все записи за отчётный период + самая новая до этого периода"
|
|||
|---|---|---|---|
|
#18+
СергиусВ голову приходят только трёхэтажные стэйтменты, с кучей subqueries в union-ах и возможно analytic functions. Достаточно одного подэтажа с аналитической функцией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2018, 17:57 |
|
||
|
Красивый SQL для "все записи за отчётный период + самая новая до этого периода"
|
|||
|---|---|---|---|
|
#18+
-2-Достаточно одного подэтажа с аналитической функцией. Вообще у ТС есть (под)задачка на TOP-N. Изложения вариантов полнее, чем у Саяна я еще не видел. http://www.fors.ru/upload/magazine/07/http_text/russia_s.malakshinov_distinct_top.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2018, 18:17 |
|
||
|
Красивый SQL для "все записи за отчётный период + самая новая до этого периода"
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousзадачка на TOP-N. Изложения вариантов полнее, чем у Саяна я еще не видел. Сорри, не та ссылка. Вот тут в комментах Саян свел местные обсуждения. https://habr.com/post/269173/ А ссылка выше - про эффективные реализации, ессно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2018, 18:40 |
|
||
|
Красивый SQL для "все записи за отчётный период + самая новая до этого периода"
|
|||
|---|---|---|---|
|
#18+
Здрасьте ещё раз, не отвечал, бо был занят отдыхом ;-) Вопрос всё ещё актуален. Отвечать можно, как предложили в зале, в поэтической форме, неким мета-sql. Я переведу, сразу на ассемблер ;-) Я почитал линки из предыдущих постов, но это не совсем то. TOP N запросы я умею, проблема в том что здесь нет постоянного N для всех договоров. Я должен был указать на эту особенность сразу, поэтому исправляюсь: - количество версий в месяце M может отличаться от договора к договору. Для одного это может быть одна (+ самая новая из предыдущего месяца), для другого 5 (+ самая новая из предыдущего месяца). Если у договора вообще нет версий в месяце M, то он не упоминается в результате. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2018, 11:02 |
|
||
|
Красивый SQL для "все записи за отчётный период + самая новая до этого периода"
|
|||
|---|---|---|---|
|
#18+
Сергиусздесь нет постоянного N для всех договоров."самая новая из предыдущего месяца" - это постоянное N=1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2018, 11:06 |
|
||
|
Красивый SQL для "все записи за отчётный период + самая новая до этого периода"
|
|||
|---|---|---|---|
|
#18+
-2-, Ну да, правильно. Пока мне в голову приходит только что-то вроде: select всех договоров/версий в месяце М union ( select rank всех версий в периоде < M, но для договоров указанных в select вверху) where rank = 1 Получается достаточно громоздко ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2018, 11:16 |
|
||
|
Красивый SQL для "все записи за отчётный период + самая новая до этого периода"
|
|||
|---|---|---|---|
|
#18+
Сергиусколичество версий в месяце M может отличаться от договора к договору. Для одного это может быть одна (+ самая новая из предыдущего месяца), для другого 5 (+ самая новая из предыдущего месяца). Если у договора вообще нет версий в месяце M, то он не упоминается в результате. Код: plaintext 1. 2. 3. После группировки остаются все версии в текущем и последняя в предыдущем, для тех договоров у которых есть хоть одна в текущем. Переводи. Если тебе лень даже написать имена колонок, то я не буду углубляться в детали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2018, 13:27 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39713773&tid=1883364]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
178ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 222ms |
| total: | 504ms |

| 0 / 0 |
