【发布时间】:2019-03-17 03:48:29
【问题描述】:
我有一个用于跟踪索赔付款的数据库。有一个索赔表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);
从这里开始,我需要用每个claim_id 的最新非空观测值替换空值。
由于我使用的是 MariaDB/MYSQL,LAG 函数不允许忽略 NULL,这是不幸的,因为它看起来很完美。
我也研究过使用 COALESCE 并对其进行分区,但似乎也不允许这样做。
我也研究过使用用户定义的函数,但是我使用了多种数据类型,似乎无法确定如何定义不需要设置输出数据类型的函数。
我整个上午都在查看以前的问题,但其中大部分是针对 PostgresSQL 的,在这种情况下并不是特别有用。我错过了什么?
【问题讨论】:
-
请同时发布
claim_month表的示例数据。 -
claim_month 与此处的视图基本相同,除了没有任何带有 NULL 的行
-
没有图片,谢谢。格式化文本工作得很好(以及所需的结果,格式相似)
-
肯定不会痛吗?
标签: mysql sql null sql-view locf