Сложный SQL для поиска предыдущей записи в сложной группе - PullRequest
2 голосов
/ 20 января 2012

Заранее спасибо, что нашли время, чтобы прочитать это и, надеюсь, помочь мне найти решение. Я застрял несколько дней на этом (но, кажется, больше).

У меня есть таблица Oracle с 6 основными столбцами:
1. группировка (Char)
2. Номер политики (Char (7) - но числовой с ведущими нулями)
3. Номер обновления (Char (2) - но числовой с ведущими нулями)
4. Номер версии (Char (4) - но числовой с ведущими нулями)
5. Дата вступления в силу
6. Срок годности

Ни один из столбцов не проиндексирован, но это столбец индекса.

Что мне нужно сделать, это:
1. найти все записи, которые в настоящее время действуют ([Срок действия]> Sysdate)
2. найти предыдущий номер политики

Результаты, которые я хотел бы получить:

ID  Group  Policy    Renew      Ver    PrevID   PrevRenew   PrevVer
10    A      0001234    04     0003      3          04        0002
22    B      0001111    00     0001      12         00        0000
44    A      0003332    01     0000      31         00        0000
55    C      0003332    28     0010      4          28        0009

Правила:
- что политика и группа всегда остаются неизменными
- несвязанные политики могут существовать в разных группах
- при обновлении политики версия начинается с «0000»
- результаты могут включать действующую в настоящее время политику и другую политику, которая будет эффективной в будущем. предыдущая политика более поздней будет, конечно, текущей

сложная часть, на которой я застреваю, это если Ver равен '0000', и я уменьшаю значение Renew на единицу, чтобы получить PrevRenew, но затем мне нужно получить максимум версии для этого, чтобы получить PrevVer.

Мои попытки создания SQL работали, но они ужасно медленные. Возможно, вы знаете простой и быстрый способ достижения результатов, которые я пытаюсь сделать? Я был бы более чем рад опубликовать, что у меня есть, если это будет полезно.

Большое спасибо!

1 Ответ

5 голосов
/ 20 января 2012

Предполагая, что под "предыдущим номером политики" вы подразумеваете "вернуть столбцы ID, Renew и Ver для строки с такими же Group и Policy и непосредственно перед Effective_Date«Вы можете использовать аналитическую функцию LAG

SELECT id,
       group,
       policy,
       renew,
       ver,
       prevID,
       prevRenew,
       prevVer
  FROM (SELECT id,
               group,
               policy,
               renew,
               ver,
               expiration_date,
               lag(id) over (partition by group, policy 
                                 order by effective_date) prevID,
               lag(renew) over (partition by group, policy 
                                    order by effective_date) prevRenew,
               lag(ver) over (partition by group, policy 
                                  order by effective_date) prevVer
          FROM some_table)
 WHERE expiration_date > sysdate;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...