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

时间:2015-03-06 13:24:09

标签: mysql group-by null

我正在尝试找到一种方法来编写一个查询,该查询将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

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

每列中不会有多个非NULL值吗?如果是这样的话:

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

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

修改

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

答案 1 :(得分:0)

我想我可能已经想出了答案。我试过sqlfiddle.com,但网站已关闭,所以我无法发布。

这是我的解决方案:

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按降序排序的分号分隔,然后它将分组的文本剪切到第一个分号(即最新/最高ID)。 NULLS没有连续,空单元格留下前导/尾随分号,因此修剪。

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

谢谢,

玛蒂