SQL:从长格式转换为宽格式时选择最大值
我有一个如下表,我需要将其从这种长格式转换为宽格式,同时,我需要选择对应于最大分数的动作值:SQL:从长格式转换为宽格式时选择最大值,sql,group-by,pivot,Sql,Group By,Pivot,我有一个如下表,我需要将其从这种长格式转换为宽格式,同时,我需要选择对应于最大分数的动作值: user_id time_id val0 val1 val2 action_value score 1 1 1 0 0 0 0.6 1 1 0 1 0 1 0.3 1 1 0 0 1 2 0.3 1 2
user_id time_id val0 val1 val2 action_value score
1 1 1 0 0 0 0.6
1 1 0 1 0 1 0.3
1 1 0 0 1 2 0.3
1 2 1 0 0 0 0.7
1 2 0 1 0 1 0.4
1 2 0 0 1 2 0.3
2 1 1 0 0 0 0.4
2 1 0 1 0 1 0.5
2 1 0 0 1 2 0.4
所需输出为:
user_id time_id score_0 score_1 score_2 action_value
1 1 0.6. 0.3. 0.3 0
1 2 0.7. 0.4 0.3. 0
2 1 0.4 0.5 0.4. 1
我使用的SQL没有PIVOT,因此无法使用PIVOT。我知道我可以使用条件聚合将数据从长格式转换为宽格式,但我不确定如何选择对应于最大分数的action\u value列。您可以使用子查询,然后使用
grest()
(如果您的数据库支持):
第一行不是应该是
0.7
,0.4
,0.3
而不是0.6
,0.3
,0.3
?如何计算动作值
?示例中不清楚。添加您的数据库类型,并解释您的计算机action_value Val0、val1、val2是action_value的一个热编码版本。我也编辑了打字错误
select
t.*,
case greatest(score0, score1, score2)
when score0 then 0
when score1 then 1
when score2 then 2
end action_value
from (
select
user_id,
time_id,
max(case when actual_value = 0 then score end) score0,
max(case when actual_value = 1 then score end) score1,
max(case when actual_value = 2 then score end) score2
from mytable
group by user_id, time_id
) t