我认为这是一种常见的情况,但我无法得到逻辑。 我有一张表如下。
PersonID SchoolID EndDate
-------- -------- -------
1 ABC 2013
1 DEF 2014
1 GHI 2010
2 XYZ 2013
2 UVW 2011
我想要以下输出
PersonID SchoolID EndDate
-------- -------- -------
1 DEF 2014
2 XYZ 2013
基本上,我想为每个人提供最新的学校。因此,我尝试做类似
的事情SELECT SchoolID, PersonID,EndDate FROM tbl
GROUP BY PersonID
HAVING EndDate = MAX(ENDDATE)
ORDER BY EndDate DESC
但我收到一条错误,说在一个HAVING子句中EndDate无效,因为它不包含在聚合函数或group by子句中。
我试过这个
SELECT SchoolID, PersonID,MAX(EndDate) FROM tbl
GROUP BY PersonID
ORDER BY EndDate DESC
由于同样的原因,我在选择列表中收到错误,说明SchoolID无效。
我在这里缺少什么?
答案 0 :(得分:2)
with cte as (SELECT *,
ROW_NUMBER() OVER(PARTITION BY PersonID
ORDER BY EndDate DESC) AS RN
FROM Table1)
select PersonId, SchoolId, EndDate from cte
where RN = 1
请参阅SqlFiddle
答案 1 :(得分:0)
您必须将MAX(Date)
包装在子查询中。
SELECT SchoolID, PersonID, Date
FROM table1 t
WHERE Date =
(SELECT MAX(Date) FROM table1
WHERE PersonID = t.PersonID);
注意:如果有多个日期与最大值绑定,则会为一个PersonID提供多行
答案 2 :(得分:0)
with temp as
(
SELECT PersonID,MAX(EndDate) as enddate FROM TABLE
GROUP BY PersonID
)
select TABLE.* from TABLE inner join temp on TABLE.personid=temp.personid
and TABLE.enddate=temp.enddate;