排名值以确定最高值

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 中的最高点和最低时间计算排名

当他们的分数相等时,如何将排名分配给他们共享最高排名的学生?

MySQL按键获取最高值,然后为其添加排名

百尺竿头更进一步:最高排名16

百尺竿头更进一步:最高排名16