我正在寻找一种方法来处理以下场景。我有一个数据库表,我只需要为表中包含的每个“组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数据库查询。
答案 0 :(得分:30)
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
)
WHERE rn = 1
即使有关系,每组最多也会返回一条记录。
在我的博客中查看这篇文章,了解两种方法的性能比较:
答案 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个以上年龄相同的人呢?最好存储出生日期而不是年龄 - 您可以随时计算出生日期以供演示。
答案 2 :(得分:1)
试试这个(假设群组是家庭的同义词)
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))
答案 3 :(得分: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