【问题标题】:GROUP BY not NULL valuesGROUP BY 不是 NULL 值
【发布时间】:2018-04-30 14:48:44
【问题描述】:

我有一个 Hive 表(无主键),类似于:

X      Y
-------------
1      a
2      a
2      a
1      b
1      b
2      c
2      NULL
1      NULL
2      d

请注意,X 列可以是 1 和 2 以外的值。

如果我不想做GROUP BY 的查询是:

SELECT X, Y
FROM my_table

我想对列Y 执行GROUP BY 操作,其中值不是NULL。此外,我想保留YNULL 值。所以结果表看起来像:

X      Y
-------------
1      a
1      b
2      c
2      NULL
1      NULL
2      d

注意,我不在乎选择了哪个 X。

基于this question,我的查询是:

SELECT 
    IFNULL(Y, UUID()) AS unq_Y,
    any(X) AS X
FROM my_table 
GROUP BY unq_Y

但是,如果YNULL,则unq_Y 将是UUID() 返回的任何内容,查询结果将是:

X      unq_Y
-------------
1      a
1      b
2      c
2      UUID()_result
1      UUID()_result
2      d

我怎样才能避免这种情况?

【问题讨论】:

  • 我添加了mysql 标签,因为同样的问题也适用(尽管解决方案可能不同)。
  • 您没有 PRIMARY KEY,这可能会在适当的时候证明有问题

标签: mysql group-by hive


【解决方案1】:

事实证明,我可以将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() 是一个不错的选择。我的版本 Hive 也不支持UUID(),所以我打电话给reflect() 来获取唯一ID。

【讨论】:

  • 是否要将所有具有y 的行显示为null
  • 我不明白你的意思。 y 的值将是 null,但 x 不会是 null 对吧?
  • 是的...这就是我要问的。当ynull 时,您想显示x 的所有值吗?或者x 的任何一个值都可以?
  • 我想在y 为空时显示x 的所有值,因此我问我只想在y 不是NULL 时执行GROUP BY。我在 SQL Fiddle 上测试了我们两个答案的结果,输出是相同的。
【解决方案2】:

如果结果集的顺序不重要,这很简单。只需使用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
;

DEMO

希望对你有帮助!

【讨论】:

  • 这是我最初的后备计划。我想避免因为这么简单的事情两次查询同一个表。
猜你喜欢
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多