排名值以确定最高值
Posted
技术标签:
【中文标题】排名值以确定最高值【英文标题】:Ranking values to determine highest value 【发布时间】:2019-11-06 16:09:18 【问题描述】:我有这样的数据:
+-----+--------+--------+--------+
| ID | score1 | score2 | score3 |
+-----+--------+--------+--------+
| 123 | 14 | 561 | 580 |
| 123 | 626 | 771 | 843 |
| 123 | 844 | 147 | 904 |
| 456 | 922 | 677 | 301 |
| 456 | 665 | 578 | 678 |
| 456 | 416 | 631 | 320 |
+-----+--------+--------+--------+
我要做的是创建另一列,提供三者中得分最高的列。请记住,我不是在寻找值是什么,而是在寻找列的名称。因此,最终输出将如下所示:
+-----+--------+--------+--------+------------+
| ID | score1 | score2 | score3 | high_score |
+-----+--------+--------+--------+------------+
| 123 | 14 | 561 | 580 | score3 |
| 123 | 626 | 771 | 843 | score3 |
| 123 | 844 | 998 | 904 | score2 |
| 456 | 922 | 677 | 301 | score1 |
| 456 | 665 | 578 | 678 | score3 |
| 456 | 416 | 631 | 320 | score1 |
+-----+--------+--------+--------+------------+
我一直在尝试进行涉及RANK()
的查询,涉及PARTITION BY
,但它没有给我我正在寻找的东西,我被正式卡住了。
【问题讨论】:
【参考方案1】:在 Redshift 中,使用case
可能最容易做到这一点:
select t.*,
(case greatest(score1, score2, score3)
when score1 then 'score1'
when score2 then 'score2'
when score3 then 'score3'
end) as high_score_name,
greatest(score1, score2, score3) as high_score
from t;
【讨论】:
戈登 - 工作就像一个魅力!谢谢你。另一个简单的问题:如果我想获得第二高,我会怎么做? 那更复杂。您应该提出一个新问题,提供示例数据并解释在出现平局时该怎么做。以上是关于排名值以确定最高值的主要内容,如果未能解决你的问题,请参考以下文章
Excel 识别重复项,确定最高优先级并将关系值应用于所有排名较低的重复项
如何根据 SQL Server 中的最高点和最低时间计算排名