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

siv3szwd  于 2022-10-31  发布在  其他
关注(0)|答案(5)|浏览(394)

我正在寻找一种方法来处理下面的场景。我有一个数据库表,我只需要为表中包含的每个“组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数据库查询的。

camsedfj

camsedfj1#

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

即使出现并列,每组也最多返回一条记录。
有关这两种方法的性能比较,请参阅我的博客中的这篇文章:

57hvy0tb

57hvy0tb2#

用途:

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个以上年龄相同的人,那又怎么样呢?最好是存储生日而不是年龄--你总是可以计算出年龄来展示。

cyvaqqii

cyvaqqii3#

试试这个(假设 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))
vaqhlq81

vaqhlq814#

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
jv2fixgn

jv2fixgn5#

SELECT GroupID, Name, Age
FROM table
INNER JOIN
(
SELECT GroupID, MAX(Age) AS OLDEST
FROM table

**GROUP BY GroupID**

) AS OLDESTPEOPLE
ON
table.GroupID = OLDESTPEOPLE.GroupID
AND
table.Age = OLDESTPEOPLE.OLDEST

相关问题