Group By MySQL 查询忽略 null 并提取最后一个值

Group By MySQL query to ignore null and pull last value

我正在尝试找到一种方法来编写一个查询,该查询将 ID 组合在一起并显示最新数据的输出,删除先前分组 ID 数据的 NULL。

例如:

ID    |    ID2   |    ColA    |    ColB    |  ColC
---------------------------------------------------
1     |    1     |    ABCD    |     XY     |    A
2     |    1     |    NULL    |     DB     |  NULL
3     |    2     |    NULL    |     WW     |    B
4     |    2     |    DCBA    |    NULL    |    C

期望的输出

ID2   |    ColA    |    ColB    |  ColC
----------------------------------------
1     |    ABCD    |     XY     |    A
2     |    DCBA    |     WW     |    C

有人可以帮忙吗?

每一列中是否只有一个非空值?如果是:

SELECT ID2,
        GROUP_CONCAT(ColA),
        GROUP_CONCAT(ColB),
        GROUP_CONCAT(ColC)
    FROM tbl
    GROUP BY ID2;

MAX() 而不是 GROUP_CONCAT() 可能会起作用。如果有多个非 NULL 值,它可能会起作用。试试吧。

编辑

请注意,GROUP_CONCAT(和其他聚合)只有在每组只有一个非 NULL 条目时才有效,如示例数据所示。如果每个组可以有多个非 NULL,则编辑您的示例。并说明选择哪一个的规则。那么,解决方案可能涉及 @variables.

我想我可能已经找到答案了。我试过 sqlfiddle.com 但网站已关闭,所以我无法 post 它。

这是我的解决方案:

SELECT
    ID2,
    IF (LOCATE(";", TRIM(BOTH ";" FROM GROUP_CONCAT(DISTINCT ColA ORDER BY ID DESC SEPARATOR ';'))), LEFT(TRIM(BOTH ";" FROM GROUP_CONCAT(DISTINCT ColA ORDER BY ID DESC SEPARATOR ';')), LOCATE(";", TRIM(BOTH ";" FROM GROUP_CONCAT(DISTINCT ColA ORDER BY ID DESC SEPARATOR ';')))-1), TRIM(BOTH ";" FROM GROUP_CONCAT(DISTINCT ColA ORDER BY ID DESC SEPARATOR ';'))) AS LastColA,
    IF (LOCATE(";", TRIM(BOTH ";" FROM GROUP_CONCAT(DISTINCT ColB ORDER BY ID DESC SEPARATOR ';'))), LEFT(TRIM(BOTH ";" FROM GROUP_CONCAT(DISTINCT ColB ORDER BY ID DESC SEPARATOR ';')), LOCATE(";", TRIM(BOTH ";" FROM GROUP_CONCAT(DISTINCT ColB ORDER BY ID DESC SEPARATOR ';')))-1), TRIM(BOTH ";" FROM GROUP_CONCAT(DISTINCT ColB ORDER BY ID DESC SEPARATOR ';'))) AS LastColB,
    IF (LOCATE(";", TRIM(BOTH ";" FROM GROUP_CONCAT(DISTINCT ColC ORDER BY ID DESC SEPARATOR ';'))), LEFT(TRIM(BOTH ";" FROM GROUP_CONCAT(DISTINCT ColC ORDER BY ID DESC SEPARATOR ';')), LOCATE(";", TRIM(BOTH ";" FROM GROUP_CONCAT(DISTINCT ColC ORDER BY ID DESC SEPARATOR ';')))-1), TRIM(BOTH ";" FROM GROUP_CONCAT(DISTINCT ColC ORDER BY ID DESC SEPARATOR ';'))) AS LastColC
FROM
    MyTable
GROUP BY
    ID2

这会将分组 ID2 的所有不同值连接在一起,用分号分隔,按 ID 降序排列,然后它将分组文本剪切到第一个分号(即 latest/highest ID)。 NULLS 没有连接,空单元格留下 leading/trailing 分号,因此 trim.

有人对此解决方案有任何意见/想法吗?

谢谢,

马蒂