我有一个数据库来跟踪索赔付款。有一张索赔表 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函数不允许忽略空值,这很不幸,因为它看起来很完美。
我也考虑过使用coalesce并对其进行分区,但这似乎也不被允许。
我还研究了如何使用用户定义的函数,但是我使用了多种数据类型,似乎无法确定如何定义一个不需要设置输出数据类型的函数。
我花了一上午的时间研究了前面的问题,但是大多数问题都是针对postgresql的,在这种情况下没有特别的帮助。我错过了什么?
1条答案
按热度按时间tez616oj1#
我已经想出了一个解决办法,但我不相信这是最好的。我怀疑对于更大的数据库,这将是相当苛刻的。但同时它也起作用了。
基本上,我使用类似于以下内容的方法,在同一个声明中,重复地将表加入到它自己的位置: