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上测试了两个答案的结果,结果是相同的。