У меня есть база данных, которая отслеживает размер претензий.
Каждая претензия имеет фиксированную информацию, которая хранится в 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)
Однако у этого есть две проблемы:
- Кажется, действительно неэффективно работать с претензиями с несколькими записями.Я не проводил никаких тестов, но это довольно очевидно.
- Это не показывает новые претензии.В приведенном выше примере будут показаны только строки 2, 3 и 5.
Где я ошибаюсь в своем алгоритме, и есть ли лучшая логика для этого?