Удаление NULL в последовательных данных - MYSQL - PullRequest
0 голосов
/ 12 октября 2018

У меня есть база данных для отслеживания претензий по платежам.Есть таблица для требований claim, таблица для ежемесячных платежей claim_month и таблица, определяющая каждый месяц month.month имеет каждую запись по порядку, так что если month_id[1] > month_id[2], то вторая цифра раньше, чем первая цифра.

Использование запроса (в целях конфиденциальности добавлена ​​рандомизация paid_to_date):

SELECT
claim.claim_id,
m.month_id,
claim_month_id,
IF (claim_month.paid_to_date IS NOT NULL, ROUND(RAND(1) * 100), NULL) AS paid_to_date
FROM
    claim
    INNER JOIN ( SELECT DISTINCT month_id FROM claim_month ) AS m
    LEFT JOIN claim_month ON claim.claim_id = claim_month.claim_id 
    AND m.month_id = claim_month.month_id

Я получаю следующие данные.

INSERT INTO ``(`claim_id`, `month_id`, `claim_month_id`, `paid_to_date`) VALUES (25, 1004, 8584, 41);
INSERT INTO ``(`claim_id`, `month_id`, `claim_month_id`, `paid_to_date`) VALUES (25, 1005, NULL, NULL);
INSERT INTO ``(`claim_id`, `month_id`, `claim_month_id`, `paid_to_date`) VALUES (25, 1006, NULL, NULL);
INSERT INTO ``(`claim_id`, `month_id`, `claim_month_id`, `paid_to_date`) VALUES (25, 1007, NULL, NULL);
INSERT INTO ``(`claim_id`, `month_id`, `claim_month_id`, `paid_to_date`) VALUES (21, 1004, 8580, 87);
INSERT INTO ``(`claim_id`, `month_id`, `claim_month_id`, `paid_to_date`) VALUES (21, 1005, NULL, NULL);
INSERT INTO ``(`claim_id`, `month_id`, `claim_month_id`, `paid_to_date`) VALUES (21, 1006, NULL, NULL);
INSERT INTO ``(`claim_id`, `month_id`, `claim_month_id`, `paid_to_date`) VALUES (21, 1007, NULL, NULL);
INSERT INTO ``(`claim_id`, `month_id`, `claim_month_id`, `paid_to_date`) VALUES (5, 1004, 8564, 14);
INSERT INTO ``(`claim_id`, `month_id`, `claim_month_id`, `paid_to_date`) VALUES (5, 1005, 8627, 9);

Data visualised

Здесь мне нужно заменить NULL на последнее ненулевое наблюдение для каждого claim_id.

  • Поскольку я использую MariaDB / MYSQL, функция LAG не позволяет игнорировать значения NULL, что, к сожалению, является идеальным.

  • Я также изучал использование COALESCE и его разбиение, но это тоже недопустимо.

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

Я провел все утро, просматривая предыдущие вопросы, однако большинство из них относится к PostgresSQL, который не особенно полезен в этом контексте.Чего мне не хватает?

1 Ответ

0 голосов
/ 18 октября 2018

Я разработал решение, но я не уверен, что оно лучшее.Я подозреваю, что для больших баз данных это было бы довольно сложно.Тем не менее, он работает в то же время.

Я, по сути, неоднократно присоединял таблицу к себе, где бы ни находилась запись ранее, и по одной и той же заявке использовал что-то похожее на следующее:

SELECT 
    b.claim_id,
    b.month_id,
    b.claim_month_id,
    claim_month.claim_month_id AS claim_month_id_latest

FROM

(SELECT
    a.claim_id,
    a.month_id,
    a.claim_month_id,
    MAX(claim_month.month_id) AS source_month_id

FROM
    (
    SELECT
        claim.claim_id,
        m.month_id,
        claim_month_id
    FROM
        claim
        INNER JOIN ( SELECT DISTINCT month_id FROM claim_month ) AS m
        LEFT JOIN claim_month ON claim.claim_id = claim_month.claim_id 
        AND m.month_id = claim_month.month_id 

    ) AS a
    LEFT JOIN claim_month ON a.claim_id = claim_month.claim_id 
                                                AND a.month_id >= claim_month.month_id

GROUP BY
    a.claim_id, a.month_id) AS b
    LEFT JOIN claim_month ON b.claim_id = claim_month.claim_id AND b.source_month_id = claim_month.month_id


ORDER BY b.claim_id, b.month_id 
...