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.
有人对此解决方案有任何意见/想法吗?
谢谢,
马蒂
我正在尝试找到一种方法来编写一个查询,该查询将 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.
有人对此解决方案有任何意见/想法吗?
谢谢,
马蒂