Отслеживание года действия политики

#python #mysql #string #hierarchical-data #recursive-query

#python #mysql #строка #иерархический-данные #рекурсивный запрос

Вопрос:

У меня есть база данных страхового полиса, которая содержит 2 столбца текущего и предыдущего номера политики.

 Current policy number | Previous policy number
ABCD-0001             | 
ABCD-0002             | ABCD-0001
ABCD-0003             | ABCD-0002
XYZ-001               |
  

Теперь я хочу отслеживать год действия политики. (ПРИМЕЧАНИЕ: номер политики — это просто пример. На самом деле это случайно)

Например: 1-я строка: предыдущий номер политики пуст => текущая политика будет 1-го года 2-я строка: 2-й год, поскольку предыдущая политика — 1-я строка (то есть 1-й год).

Я начинаю использовать Python и Mysql, поэтому я понятия не имею, как отслеживать год действия политики.

С помощью Python я перебираю каждую строку и вставляю результат в список. Например: 1-я строка — 1-й год => вставить в list_tracking

 Current policy number | Previous policy number | Year
ABCD-0001             |                        | 1
  

Затем в следующей строке, если есть предыдущая политика, я получаю год предыдущей политики с помощью list.index и добавляю 1.

Однако этот способ кажется сложным и медленным при увеличении или обновлении данных. В Excel я могу легко сделать это с помощью комбинации if и vlookup: если предыдущий год пуст, то 1; если нет, то vlookup за предыдущий год и добавьте 1 к значению vlookup.

Пожалуйста, любезно поделитесь какой-нибудь новой идеей как в Python, так и в Mysql или их комбинации.

Заранее спасибо.

Комментарии:

1. Являются ли пустые строки пустыми или они имеют Null в них значения?

2. ‘… На самом деле это случайно)’ — итак, как вы узнаете год действия политики?

3. @SeyiDaniel: Да, это Null

4. @P.Salmon: Наша система спроектирована так, что при вводе текущей политики вы должны следовать предыдущей, чтобы база данных записывала текущую политику и предыдущую политику

Ответ №1:

Я думаю, вам нужен рекурсивный запрос:

 with cte as (
    select current_policy_number, previous_policy_number, 1 rn 
    from mytable 
    where previous_policy_number is null
    union all
    select t.current_policy_number, t.previous_policy_number, c.rn   1
    from cte c
    inner join mytable t on t.previous_policy_number = c.current_policy_number
)
select * from cte
  

Рекурсивное with предложение начинается со строк, у которых есть предыдущий номер политики null , и присваивает им номер строки 1 . Затем он пересекает иерархическую структуру от корня до листьев, увеличивая номер строки по мере продвижения.

Обратите внимание, что рекурсивные запросы доступны только в MySQL 8.0.

Комментарии:

1. Похоже, это то, что я ищу. Я попытаюсь посмотреть, работает ли это. Большое спасибо.