我正在尝试找到一种方法来编写一个查询,该查询将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
有人可以帮忙吗?
答案 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没有连续,空单元格留下前导/尾随分号,因此修剪。
任何人对此解决方案有任何意见/想法吗?
谢谢,
玛蒂