配置单元-跨列/多行的最大值

时间:2018-06-19 14:56:07

标签: sql hive

我的数据如下:

ip, category, a_score, b_score, c_score
1.2.3.4, X, 0, 5, 0
1.2.3.4, X, 3, 0, NULL
1.2.3.4, Y, 1, NULL, NULL
1.2.3.4, Y, 0, 2, 0
1.2.3.4, Z, 1, 0, 9
1.2.3.4, Z, 0, 2, 0

每个IP最多可以包含8个类别,每个类别最多可以包含3个有效分数(a_score,b_score,c_score)。

对于每个IP,我需要找到该类别所有分数中每个类别的最高分数。

所以在这种情况下,我会得到

1.2.3.4, X, 5
1.2.3.4, Y, 2
1.2.3.4, Z, 9

,即,类别X在A / B / C得分中的最大值是第一行的c_score; Y类别在A / B / C得分中的最大值是第二行的b_score; Z类的A / b / c得分最高的值是第一行的c_score。

我尝试了以下方法

select ip, category, greatest(max(a_score), max(b_score), max(c_score)) from mytable where ip = '1.2.3.4' group by ip, category;

但是这只会返回NULL。

我将如何处理? TIA。

2 个答案:

答案 0 :(得分:2)

如您所见,

greatest()的{​​{1}}值有问题。对于您的情况,您可以执行以下操作:

NULL

这是假设分数永远不会为负。

另一种方法是在聚合之前取消透视。但是,这要么需要多次读取数据,要么需要复杂的select ip, category, nullif(greatest(coalesce(max(a_score), -1), coalesce(max(b_score), -1), coalesce(max(c_score), -1)), -1) from mytable where ip = '1.2.3.4' group by ip, category; 表达式。

答案 1 :(得分:2)

coalesce0(零)一起使用:

select ip, category, 
     max(greatest(coalesce(a_score,0), coalesce(b_score,0), coalesce(c_score,0))) max_score
  from mytable 
 where ip = '1.2.3.4' 
group by ip, category;

Rextester Demo