Преобразование единовременных сумм в транзакции - PullRequest
0 голосов
/ 25 сентября 2018

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

Каждая претензия имеет фиксированную информацию, которая хранится в claim (например, claim_id и date_reported_to_insurer).

Каждый месяц я получаю отчет, который добавляется в таблицу claim_month.Сюда входят такие поля, как claim_id, month_id [101 - 31/01/2018, 102 - 28/02/2018 и т. Д.] И paid_to_date.

, поскольку большинство утверждений не изменяются смесяц за месяцем я добавляю запись для Claim_month только тогда, когда показатель изменился с прошлого месяца.Таким образом, претензия может иметь отчет за июнь и отчет за август, но не отчет за июль.Это может быть связано с тем, что сумма, выплаченная на сегодняшний день, увеличилась в июне и августе, а не в июле.

Проблема, с которой я столкнулся сейчас, заключается в том, что я хочу иметь возможность проверять сумму, выплачиваемую каждый месяц.

Рассмотрим следующие примерные данные:

+----------------+----------+----------------+--------------+
| claim_month_id | claim_id | month_id       | paid_to_date |
+----------------+----------+----------------+--------------+
| 1              | 1        | 6              | 1000         |
+----------------+----------+----------------+--------------+
| 5              | 1        | 7              | 1200         |
+----------------+----------+----------------+--------------+
| 7              | 2        | 6              | 500          |
+----------------+----------+----------------+--------------+
| 12             | 1        | 9              | 1400         |
+----------------+----------+----------------+--------------+
| 18             | 2        | 8              | 600          |
+----------------+----------+----------------+--------------+

Если мы предположим, что это вся информация, касающаяся претензий 1 и 2, то это предполагает, что они обе являются претензиями, которые произошли в июне2018. Их транзакции должны выглядеть следующим образом:

+----------------+----------+----------------+------------+
| claim_month_id | claim_id | month_id       | paid_month |
+----------------+----------+----------------+------------+
| 1              | 1        | 6              | 1000       |
+----------------+----------+----------------+------------+
| 5              | 1        | 7              | 200        |
+----------------+----------+----------------+------------+
| 7              | 2        | 6              | 500        |
+----------------+----------+----------------+------------+
| 12             | 1        | 9              | 200        |
+----------------+----------+----------------+------------+
| 18             | 2        | 8              | 100        |
+----------------+----------+----------------+------------+

Я использую для этого алгоритм

SELECT claim_month_id, 
       month_id, 
       claim_id, 
       new.paid_to_date - old.paid_to_date AS paid_to_date_change, 
FROM   claim_month AS new 
       LEFT JOIN claim_month AS old 
              ON new.claim_id = old.claim_id 
                 AND ( new.month_id > old.month_id 
                        OR old.month_id IS NULL ) 
GROUP  BY new.claim_month_id 
HAVING old.month_id = Max(old.month_id)

Однако у этого есть две проблемы:

  1. Кажется, действительно неэффективно работать с претензиями с несколькими записями.Я не проводил никаких тестов, но это довольно очевидно.
  2. Это не показывает новые претензии.В приведенном выше примере будут показаны только строки 2, 3 и 5.

Где я ошибаюсь в своем алгоритме, и есть ли лучшая логика для этого?

1 Ответ

0 голосов
/ 25 сентября 2018

Используйте функцию LAG для получения следующих paid_to_date каждого claim_id и используйте текущий paid_to_date минус следующий paid_to_date.

SELECT 
claim_month_id, 
claim_id, 
month_id,
paid_to_date - LAG(paid_to_date, 1, 0) OVER (PARTITION BY claim_id ORDER BY month_id) AS paid_month
FROM claim

Таблица вывода:

+----------------+----------+----------+------------+
| claim_month_id | claim_id | month_id | paid_month |
+----------------+----------+----------+------------+
|              1 |        1 |        6 |       1000 |
|              5 |        1 |        7 |        200 |
|             12 |        1 |        9 |        200 |
|              7 |        2 |        6 |        500 |
|             18 |        2 |        8 |        100 |
+----------------+----------+----------+------------+
...