我正在寻找一种处理以下情况的方法。我有一个数据库表,对于该表中包含的每个“组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数据库进行查询。
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
即使有平局,每组最多返回一条记录。
请参阅我的博客中的本文,以比较这两种方法的性能:
用途:
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个以上年龄相同的人怎么办?最好存储生日而不是年龄-您总是可以计算出要显示的生日。
尝试一下(假设Group是Household的同义词)
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))
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