mysql - 删除顺序数据中的 NULL - MYSQL

标签 mysql sql null sql-view locf

我有一个用于跟踪 claim 付款的数据库。有一个 claim 表 claim,一个每月付款表 claim_month 和一个定义每个月的表 monthmonth 按顺序排列每个条目,因此如果 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

从这里开始,我需要用每个 claim_id 的最新非空观察值替换 NULL。

  • 由于我使用的是 MariaDB/MYSQL,因此 LAG 函数不允许忽略 NULL,这很不幸,因为它看起来很完美。

  • 我也研究过使用 COALESCE 并对其进行分区,但这似乎也不允许。

  • 我也研究过使用用户定义的函数,但是我使用的是多种数据类型,似乎无法弄清楚如何定义不需要设置输出数据类型的函数。

我整个上午都在浏览之前的问题,但其中大部分是针对 PostgresSQL 的,这在这种情况下并不是特别有用。我错过了什么?

最佳答案

我已经制定了一个解决方案,但我不认为它是最好的。我怀疑对于更大的数据库,这会要求很高。然而,它同时起作用。

我基本上已经将表格重复地连接到自身,只要记录较早并且使用类似于以下内容的相同声明:

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 

关于mysql - 删除顺序数据中的 NULL - MYSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52770608/

相关文章:

javascript - 如何将 msg 添加到 undefined variable ?

如果没有找到结果,SQL 返回行

php - 简单选择查询中返回的行 ID 不正确

mysql - Sequelize : multiple where clause

php - 单篇文章的多个类别(PHP MYSQL)

sql - 就用途而言,准备好的语句和 SQL 或 PL/pgSQL 函数之间有什么区别?

sql-server - 为什么空记录集上的 SUM(...) 返回 NULL 而不是 0?

php - 使用 PHP 通过选择菜单发送 id

mysql - 如何编写一个语法正确但在运行时生成错误的简短查询?

php - 如何在 php 的 csv 中的一行中插入 sql 查询结果?