我正在尝试仅选择每个ID具有最高seq的行
ID | Seq | Age
-------------------
A 1 20
A 2 30
B 1 25
B 2 32
B 3 44
B 4 48
C 1 11
这似乎有效
SELECT ID, Age
FROM Persons a
WHERE Seq = (SELECT MAX(Seq) FROM Persons b WHERE a.ID = b.ID)
但这是最好的方式,唯一的方法吗?我不喜欢使用子查询,如果我不需要,我记得你可以使用一些东西,但我忘了它是什么。有什么想法吗?
答案 0 :(得分:6)
假设SQL-Server(> = 2005)或Oracle(10g?):
WITH CTE AS
(
SELECT
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Seq DESC) AS RN
, ID, Age
FROM
Persons
)
SELECT ID, Age
FROM CTE
WHERE RN = 1
ROW_NUMBER
返回结果集分区中行的序号。
修改:您也可以在Oracle中查看:http://sqlfiddle.com/#!4/b7e79/2/0
答案 1 :(得分:1)
一般情况下,您需要使用窗口或排名函数 - Rank()
,Row_number()
等。
select *
from
(
select *, row_number() over (partition by id order by age desc) rn
from yourtable
) v
where rn = 1
这适用于SQL Server 2005+ - 在oracle中,您可能需要明确指定字段名称,而不是*
答案 2 :(得分:1)
如果您使用不支持窗口函数的RDBMS,您可以使用:
SELECT Persons.ID, Persons.Age, Persons.Seq
FROM Persons
INNER JOIN
( SELECT Persons.ID, MAX(Seq) AS Seq
FROM Persons
GROUP BY Persons.ID
) MaxP
ON MaxP.ID = Persons.ID
AND MaxP.Seq = Persons.Seq
它仍然涉及一个子查询,但我没有看到没有一个这样做的方法,我也不明白你为什么要避免它们。