【问题标题】:SQL Query : how to Select Maximum value of each group of joined tablesSQL查询:如何选择每组连接表的最大值
【发布时间】:2020-08-28 01:31:30
【问题描述】:

当此表连接到另一个名为 tblClubs 的表(有 9 条记录)时,我有返回这 2 个表中玩家的最大年龄的问题,表 tblplayers(有 34 条记录)。

tblPlayers 字段是:

ID(Autonumber) | CLubID(Number) | Player Name(Text) | PlayerAge(Number)

tblClubs 字段为:

ID(Autonumber) | ClubName (Text)

现在我需要显示他们自己俱乐部中其他球员中年龄最大的球员的姓名以及旁边的俱乐部名称,如下所示:

Club Name | Player Name | Maximum Age (older player of each club)

请告诉我怎么做?

【问题讨论】:

  • 您使用的是哪种 DBMS 产品? “SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您使用的数据库产品添加tagWhy should I tag my DBMS

标签: sql join subquery greatest-n-per-group


【解决方案1】:

SQL Fiddle

MS SQL Server 2017 架构设置

CREATE TABLE tblPlayers (ID INT, ClubID INT,PlayerName VARCHAR(255)
                         ,PlayerAge INT)
CREATE TABLE tblClubs (ID int,ClubName VARCHAR(255))   

INSERT INTO tblPlayers(ID,ClubID,PlayerName
                       ,PlayerAge) VALUES (1,1,'John',30)
                       ,(2,1,'Mark',25)
                       ,(3,1,'Albert',36)
                       ,(4,2,'David',33)
                       ,(5,2,'John',31)
INSERT INTO tblClubs(ID, ClubName) VALUES(1,'TEAM 1')
                                  ,(2,'TEAM 2')

查询 1

SELECT
    *
FROM
    (SELECT A.*,RANK() OVER 
     (PARTITION BY A.ClubID ORDER BY A.PlayerAge desc) as rn
    FROM tblPlayers A
    INNER JOIN tblClubs B ON A.ClubID=B.ID) t
WHERE
    t.rn = 1

Results

| ID | ClubID | PlayerName | PlayerAge | rn |
|----|--------|------------|-----------|----|
|  3 |      1 |     Albert |        36 |  1 |
|  4 |      2 |      David |        33 |  1 |

【讨论】:

    【解决方案2】:

    如果您的数据库支持,您可以使用窗口函数解决此问题:

    select c.club_name, p.player_name, p.player_age
    from clubs c 
    inner join (
        select 
            p.*, 
            rank() over(partition by p.club_id order by p.player_age desc) rn 
        players p
    ) p on p.club_id = c.id and p.rn = 1
    

    一种常见且非常便携的替代方法是使用子查询进行过滤:

    select 
        c.club_name, 
        t.player_name,
        t.player_age
    from players p
    inner join clubs c on c.id = p.club_id
    where p.age = (select max(p1.age) from players p1 where p1.club_id = p.club_id)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      相关资源
      最近更新 更多