我的数据如下:
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。
答案 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)
将coalesce
与0
(零)一起使用:
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;