假设我有以下数据。
OrderedSet
我想按number group
1 a
1 a
3 a
4 a
4 a
5 c
6 b
6 b
6 b
7 b
8 b
9 b
10 b
14 b
15 b
对数据进行分组,然后添加一个列,说明每个群组有多少group
个不同的值。
我想要的输出如下:
number
我试过的是:
number group dist_number
1 a 3
1 a 3
3 a 3
4 a 3
4 a 3
5 c 1
6 b 9
6 b 9
6 b 9
7 b 9
8 b 9
9 b 9
10 b 9
14 b 9
15 b 9
正如人们所看到的,这会全局聚合并独立于组计算不同值的数量。
我可以做的一件事是使用> select *, count(distinct number) over(partition by group) from numbers;
11 11
,如下所示:
group by
然后加入hive> select *, count(distinct number) from numbers group by group;
a 3
b 7
c 1
但我想也许有一个更简单的解决方案,例如,使用group
方法?
答案 0 :(得分:1)
你肯定想在这里使用窗口函数。我不确定你是如何从你试过的查询中得到11 11
的;我99%肯定如果您在Hive中count(distinct _)
尝试使用over/partition
它会抱怨。要解决此问题,您可以使用collect_set()
获取分区中不同元素的数组,然后使用size()
来计算元素。
<强>查询强>:
select *
, size(num_arr) dist_num
from (
select *
, collect_set(num) over (partition by grp) num_arr
from db.tbl ) x
<强>输出强>:
4 a [4,3,1] 3
4 a [4,3,1] 3
3 a [4,3,1] 3
1 a [4,3,1] 3
1 a [4,3,1] 3
15 b [15,14,10,9,8,7,6] 7
14 b [15,14,10,9,8,7,6] 7
10 b [15,14,10,9,8,7,6] 7
9 b [15,14,10,9,8,7,6] 7
8 b [15,14,10,9,8,7,6] 7
7 b [15,14,10,9,8,7,6] 7
6 b [15,14,10,9,8,7,6] 7
6 b [15,14,10,9,8,7,6] 7
6 b [15,14,10,9,8,7,6] 7
5 c [5] 1
我在输出中包含了数组,因此您可以看到发生了什么,显然您可以在查询中丢弃它们。需要注意的是,在这里进行自我加入实际上是一场关于性能的灾难(而且还有更多的代码行)。
答案 1 :(得分:0)
根据您的要求,这可能有效:
select number,group1,COUNT(group1) OVER (PARTITION BY group1) as dist_num from table1;