Mysql 按非空值分组
我有一个蜂巢表(没有主键),看起来类似于:Mysql 按非空值分组,mysql,group-by,hive,Mysql,Group By,Hive,我有一个蜂巢表(没有主键),看起来类似于: X Y ------------- 1 a 2 a 2 a 1 b 1 b 2 c 2 NULL 1 NULL 2 d 注意X列可以是除1和2之外的值 如果我不想执行分组,则查询如下: SELECT X, Y FROM my_table SELECT IFNULL(Y, UUID()) AS unq_Y, any(X) AS X F
X Y
-------------
1 a
2 a
2 a
1 b
1 b
2 c
2 NULL
1 NULL
2 d
注意X
列可以是除1和2之外的值
如果我不想执行分组,则查询如下:
SELECT X, Y
FROM my_table
SELECT
IFNULL(Y, UUID()) AS unq_Y,
any(X) AS X
FROM my_table
GROUP BY unq_Y
我想对值不是NULL
的列Y
执行groupby
操作。此外,我想保留Y
的NULL
值。因此,生成的表如下所示:
X Y
-------------
1 a
1 b
2 c
2 NULL
1 NULL
2 d
注意,我不在乎选择哪个X
根据,我的问题是:
SELECT X, Y
FROM my_table
SELECT
IFNULL(Y, UUID()) AS unq_Y,
any(X) AS X
FROM my_table
GROUP BY unq_Y
但是,unq_Y
将是UUID()
返回的任何内容,如果Y
为NULL
,则查询结果将是:
X unq_Y
-------------
1 a
1 b
2 c
2 UUID()_result
1 UUID()_result
2 d
如何避免这种情况?如果结果集的顺序不重要,那就很简单了。只需按如下方式使用union all
:
SELECT
X AS X,
Y AS unq_Y
FROM my_table
where y is not null
GROUP BY unq_Y
union all
SELECT
X AS X,
Y AS unq_Y
FROM my_table
where y is null
;
希望有帮助 结果是,我可以将NULL
检查放在GROUP BY
子句中:
SELECT
any(Y) AS Y,
any(X) AS X
FROM my_table
GROUP BY COALESCE(Y, CAST(reflect("java.util.UUID", "randomUUID") AS STRING));
我的Hive版本不支持IFNULL()
,因此COALESCE()
是一个不错的选择。我的版本配置单元也不支持UUID()
,因此我调用了reflect()
,以获得唯一的id。我添加了mysql
标记,因为同样的问题也会出现(尽管解决方案可能不同)。您没有主键,这可能会在适当的时候出现问题这是我最初的回退计划。我希望避免在如此简单的问题上查询同一个表两次。是否要将所有具有y
的行显示为null
?我不明白您的意思。y
的值应该是null
,但是x
不会是null
对吧?是的……这就是我要问的。当y
为null
时,是否要显示x
的所有值?或者x
的任何一个值都可以?我想在y
为空时显示x
的所有值,因此我问为什么我只想在y
不为null
时按分组。我在SQLFiddle上测试了两个答案的结果,结果是相同的。