每个组ID仅返回1条记录的SQL查询

问题描述 投票:22回答:4

我正在寻找一种处理以下情况的方法。我有一个数据库表,对于该表中包含的每个“组ID”,我只需要返回一条记录,此外,在每个组中选择的记录应该是家庭中年龄最大的人。

ID   Group ID   Name               Age
1   134        John Bowers        37
2   134        Kerri Bowers       33
3   135        John Bowers        44
4   135        Shannon Bowers     42

因此,在上面提供的示例数据中,我需要返回ID 1和3,因为它们是每个组ID中年龄最大的人。

正在针对SQL Server 2005数据库进行查询。

sql sql-server sql-server-2005
4个回答
33
投票
SELECT  t.*
FROM    (
        SELECT  DISTINCT groupid
        FROM    mytable
        ) mo
CROSS APPLY
        (
        SELECT  TOP 1 *
        FROM    mytable mi
        WHERE   mi.groupid = mo.groupid
        ORDER BY
                age DESC
        ) t

或此:

SELECT  *
FROM    (
        SELECT  *, ROW_NUMBER() OVER (PARTITION BY groupid ORDER BY age DESC) rn
        FROM    mytable
        ) x
WHERE   x.rn = 1

即使有平局,每组最多返回一条记录。

请参阅我的博客中的本文,以比较这两种方法的性能:


4
投票

用途:

SELECT DISTINCT
       t.groupid,
       t.name
  FROM TABLE t
  JOIN (SELECT t.groupid,
               MAX(t.age) 'max_age'
          FROM TABLE t
      GROUP BY t.groupid) x ON x.groupid = t.groupid
                           AND x.max_age = t.age

那么如果一个小组中有2个以上年龄相同的人怎么办?最好存储生日而不是年龄-您总是可以计算出要显示的生日。


1
投票

尝试一下(假设GroupHousehold的同义词)

Select * From Table t
Where Age = (Select Max(Age)
             From Table 
             Where GroupId = t.GroupId)

[如果某个家庭中有两个或两个以上“最老”的人(他们都是同一年龄,没有其他人更老了,那么这将使他们全部返回,而不仅仅是随机返回一个。)>

如果这是一个问题,那么您需要添加另一个子查询以为该集合中的一个人返回任意键值。

Select * From Table t
Where Id = 
  (Select Max(Id) Fom Table 
   Where GroupId = t.GroupId
      And Age =
         (Select(Max(Age) From Table
          Where GroupId = t.GroupId))

0
投票
SELECT GroupID, Name, Age
FROM table
INNER JOIN
(
SELECT GroupID, MAX(Age) AS OLDEST
FROM table
) AS OLDESTPEOPLE
ON
table.GroupID = OLDESTPEOPLE.GroupID
AND
table.Age = OLDESTPEOPLE.OLDEST
© www.soinside.com 2019 - 2024. All rights reserved.