SQL子查询按“非null”分组

时间:2019-03-20 09:47:24

标签: sql group-by

我从一个庞大的查询中得到以下结构,其中每列都有子查询。目标是首先为每个列提供非NULL值。

+-----+--------+--------+--------+-------+
| id  |  val1  |  val2  |  val3  |  val4 |
+-----+--------+--------+--------+-------+
|   1 |  STR1  | NULL   | NULL   |  NULL |
|   1 |  NULL  | STR2   | NULL   |  NULL |
|   1 |  NULL  | NULL   | STR3   |  NULL |
|   1 |  NULL  | NULL   | NULL   |  STR4 |
|   2 |  STR1  | NULL   | NULL   |  NULL |
|   2 |  NULL  | STR2   | NULL   |  NULL |
+-----+--------+--------+--------+-------+

所需结果:

+-----+--------+--------+--------+-------+
| id  |  val1  |  val2  |  val3  |  val4 |
+-----+--------+--------+--------+-------+
|   1 |  STR1  | STR2   | STR3   |  STR4 |
|   2 |  STR1  | STR2   | NULL   |  NULL |
+-----+--------+--------+--------+-------+

我的目标是按ID分组,但首先要查询所有非NULL字段。我尝试将其与MAX函数和GROUP_CONCAT函数一起使用,但两者都不是我要搜索的。

您对如何实现此目标有想法吗?非常感谢您的帮助。

最佳内线

edit:以正确的顺序与max一起解决。很抱歉,我为此感到有些as愧。

3 个答案:

答案 0 :(得分:1)

在SQL中,不同行之间没有“第一”和“最后”之类的东西。

您要的东西看起来就像是COALESCE,它们出现在列中(针对某些特定的行子集)出现在某些值系列上。

但是,由于COALESCE的定义取决于排序,并且SQL没有[在行之间]这样的排序的概念,因此您所定义的要求不存在。

您需要做的是确定所需的顺序,并以SQL表示。只有这样做之后,您使用的“第一”这个词才能具有任何含义。

答案 1 :(得分:0)

使用聚合

select id,max(val1) as val1,
max(val2) as val2,max(val3) as val3,
max(val4) as val4
from table group by id

答案 2 :(得分:0)

从表顺序中选择id,val1,val2,val3,val4,由val1,val2,val3,val4为空;