删除顺序数据中的 NULL - MYSQL
Removing NULLs in sequential data - MYSQL
我有一个用于跟踪理赔付款的数据库。有一个 table 用于索赔 claim
,一个 table 用于每月付款 claim_month
和一个 table 定义每个月 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);
从这里开始,我需要用每个 claim_id
的最新非空观察替换 NULL。
由于我使用的是 MariaDB/MYSQL,LAG 函数不允许忽略 NULL,这很不幸,因为它看起来很完美。
我也研究过使用 COALESCE 并将其分区,但这似乎也不允许。
我也研究过使用用户定义的函数,但是我使用的是多种数据类型,似乎无法弄清楚如何定义不需要设置输出数据的函数类型。
我整个上午都在浏览之前的问题,但其中大部分是针对 PostgresSQL 的,在这种情况下并不是特别有用。我错过了什么?
我已经制定了解决方案,但我不认为它是最好的。我怀疑对于更大的数据库,这会要求很高。然而,它同时工作。
我基本上已经将 table 重复加入自身,只要记录较早并且使用类似于以下内容的相同声明:
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
我有一个用于跟踪理赔付款的数据库。有一个 table 用于索赔 claim
,一个 table 用于每月付款 claim_month
和一个 table 定义每个月 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);
从这里开始,我需要用每个 claim_id
的最新非空观察替换 NULL。
由于我使用的是 MariaDB/MYSQL,LAG 函数不允许忽略 NULL,这很不幸,因为它看起来很完美。
我也研究过使用 COALESCE 并将其分区,但这似乎也不允许。
我也研究过使用用户定义的函数,但是我使用的是多种数据类型,似乎无法弄清楚如何定义不需要设置输出数据的函数类型。
我整个上午都在浏览之前的问题,但其中大部分是针对 PostgresSQL 的,在这种情况下并不是特别有用。我错过了什么?
我已经制定了解决方案,但我不认为它是最好的。我怀疑对于更大的数据库,这会要求很高。然而,它同时工作。
我基本上已经将 table 重复加入自身,只要记录较早并且使用类似于以下内容的相同声明:
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