我有这种格式的数据。我想将多行合并为按ID列进行的单行分组。按ID分组时,每一行每一列将只有一个非空值和一个非空值。
[ID], [foo], [foo1], [foo2], [foo3], [foo4], [foo5]
1, data1, null, null, null, null, null
1, null, data2, null, null, null, null
1, null, null, data3, null, null, null
1, null, null, null, data4, null, null
1, null, null, null, null, data5, null
1, null, null, null, null, null, data6
2, data1, null, null, null, null, null
2, null, data2, null, null, null, null
2, null, null, data3, null, null, null
2, null, null, null, data4, null, null
2, null, null, null, null, data5, null
2, null, null, null, null, null, data6
Desired Output:
[ID], [foo], [foo1], [foo2], [foo3], [foo4], [foo5]
1, data1, data2, data3, data4, data5, data6
2, data1, data2, data3, data4, data5, data6
答案 0 :(得分:3)
您可以使用max()
:
select id, max(foo) as foo, max(foo1) as foo1, . . .
from t
group by id;
我应该注意,您的原始数据结构通常是由有点歪斜的查询产生的。有时,更容易修复生成结果的代码。
答案 1 :(得分:2)
聚合函数max
和min
(以及大多数其他函数)将仅忽略null
。您可以按ID分组并查询其他列的最大值,这将返回该列具有的单个非null
值:
SELECT id, MAX(foo), MAX(foo1), MAX(foo2), MAX(foo3), MAX(foo4), MAX(foo5)
FROM mytable
GROUP BY id