如何在没有分组依据的情况下选择具有最大技能属性的 ID

Posted

技术标签:

【中文标题】如何在没有分组依据的情况下选择具有最大技能属性的 ID【英文标题】:How to select ID with max skill attribute without group by 【发布时间】:2021-07-15 10:41:29 【问题描述】:

如何在不按 id 分组的情况下选择具有最高技能的 id。

我想保留max(skill) in的记录

select ID, max(skill) from skill_table group by ID, skill

但是当我按 id 分组时,我会得到所有记录,因为它的唯一键

ID Skill
89fddc8855819055015581a48fdf000c 2
8a12d16c7539f28a01754a884e2801c0 1

我需要用类似这样的方式保留技能 2 的 ID

CASE WHEN max(SKILL)THEN ID END 

有什么建议吗?

【问题讨论】:

SELECT ID FROM Skill_table WHERE rownum 【参考方案1】:

Skill 降序排列,然后得到第一行(如果可能有很多最大行,则为平局):

SELECT *
FROM   skill_table
ORDER BY skill DESC
FETCH FIRST ROW WITH TIES;

如果您只想要一行,请使用FETCH FIRST ROW ONLY

如果您使用的不是 Oracle 12c 或更高版本,请使用 RANK 分析函数:

SELECT *
FROM   (
  SELECT s.*,
         RANK() OVER ( ORDER BY skill DESC ) rnk
  FROM   skill_table s
)
WHERE  rnk = 1;

或者,如果您只想要一行(而不是所有最大值),那么请使用 ROW_NUMBER 而不是 RANK

如果您真的想使用聚合,请使用KEEP

SELECT MAX(Skill) AS skill,
       MAX(id) KEEP ( DENSE_RANK LAST ORDER BY Skill ) AS id
FROM   Skill_table

db小提琴here

【讨论】:

Rank 函数正是我想要的。非常感谢

以上是关于如何在没有分组依据的情况下选择具有最大技能属性的 ID的主要内容,如果未能解决你的问题,请参考以下文章

具有内部联接、多个分组依据和最小最大值的 Linq 查询

MySQL - 在没有 LIMIT 或 JOIN 的情况下选择指定搜索的最大值

SQL 优化(分组依据和最大值)

即使字段包含在分组依据列表中,分组依据或聚合错误

如何在不显示所有结果的最大值的情况下为数学运算以及其他元素选择最大值

加入和分组依据 - 选择列表中的列无效