#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. Похоже, это то, что я ищу. Я попытаюсь посмотреть, работает ли это. Большое спасибо.