SQL查询:如何选择每组联接表的最大值

问题描述 投票:-1回答:2

我有这个问题,当我将这两个表连接到另一个名为tblClubs的表(具有9条记录)时,我会在这2个表中返回最大的AGE年龄,表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)

请告诉我我该怎么做?

sql join subquery greatest-n-per-group
2个回答
0
投票

如果数据库支持,则可以使用窗口函数来解决:

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)

0
投票

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 |
© www.soinside.com 2019 - 2024. All rights reserved.