【问题标题】:sql-group by querysql-group by 查询
【发布时间】:2017-03-13 16:34:11
【问题描述】:

这几天我正在做我的 SQL 项目,我需要帮助。

我有一个名为“玩家”的表和另一个名为“统计”的表。
我想为每个角色找到最好的球员。
我已经完成了这个查询,我只得到了角色和等级。
我想得到这个球员的名字和姓氏。

我应该在这个查询中添加什么才能得到它

select   role, max(grade) 
from     players 
join     statistics 
on       players.player_id=statistics.player_id 
group by role

【问题讨论】:

  • 你能添加你的表架构吗?
  • 嗨,阿米特,欢迎来到 SO!请考虑阅读this 以了解如何提问。您可以将列添加到您的选择中,如下所示:从玩家中选择名字、姓氏、角色;
  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?
  • 即使这个问题也得到了解答,请考虑查看此链接,了解更多关于如何提出完美问题的信息:spaghettidba.com/2015/04/24/…
  • 还请标记您正在使用的 DBMS,例如 SQLServer/Oracle...

标签: sql group-by greatest-n-per-group


【解决方案1】:

您可以使用公用表表达式和窗口函数来做到这一点:

WITH Ranks AS (
    SELECT first_name, last_name, role, grade, 
        ROW_NUMBER() OVER (PARTITION BY role ORDER BY grade DESC) AS rank
    FROM players
        join statistics on(
            players.player_id = statistics.player_id
        )
)
SELECT first_name, last_name, role, grade
FROM Ranks
WHERE rank = 1

这样做是必要的,因为如果你只是将 first_namelast_name 添加到 SELECT 子句中,你会得到一个错误,如果你也将它们添加到你的 GROUP BY 子句中,你会每个玩家获得一排,这不是您想要的。


解释性编辑

公用表表达式

WITH Ranks AS ( /*query*/ ) 位就像一个子查询;这是一个查询,其结果用于随后的主查询。在这里,我们将挑选所有玩家,以及他们在角色中的排名。

您可以阅读有关公用表表达式 (CTE) here 的更多信息。

窗口函数

ROW_NUMBER() OVER (PARTITION BY role ORDER BY grade DESC) 位为查询定义了一个新列。它说:

获取结果集,并将其拆分为具有相同role 值的分区。然后按grade 的值降序排列。最后,在每个分区中分配一个行号,并且已经建立了排序。

您可以阅读更多关于窗口函数的信息here

【讨论】:

  • 你能解释一下这个查询吗?什么意思是“WITH Rans As”,“OVER (PARTITION BY role ORDER BY Grade DESC) AS rank”
  • 我已经添加了对这些部分的解释。希望他们有意义!
【解决方案2】:

看起来您只需要添加到查询的选择部分?

select
    first_name, -- Column name guessed as you haven't shared your table structure with us
    last_name,
    role,
    max(grade)
from
    players
    join statistics on(
        players.player_id = statistics.player_id
    )
group by
    first_name,
    last_name,
    role

【讨论】:

  • 认为您可能需要将first_namelast_name 添加到您的group by 子句中,否则您可能会收到错误...
  • 这是一个无效的group by用法
猜你喜欢
  • 1970-01-01
  • 2022-01-03
  • 2019-01-21
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-22
  • 2021-11-17
相关资源
最近更新 更多