这是我的表结构: -
Table01
ID Name FkID dateTime
1 John 1 2012-06-01
2 Peter 2 2012-06-02
3 Penny 2 2012-06-03
4 Patty 3 2012-06-01
我尝试了这个查询但是:(
select *
from Table01
where FkID in
(SELECT FkID FROM Table01 GROUP BY FkID HAVING ( COUNT(PkID) < 2 ))
order by dateTime desc
期望的结果: -
1 John 1 2012-06-01
3 Penny 2 2012-06-03
4 Patty 3 2012-06-01
我需要FkID的独特结果,但是从重复的FkID我需要按最新的日期时间选择排队。请指点。
答案 0 :(得分:1)
您可以使用ROW_NUMBER来实现这一目标。
WITH A AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY FkID ORDER BY dateTime DESC) AS rn
FROM Table01
)
SELECT ID, Name, FkID, dateTime
FROM A
WHERE rn = 1;
我使用了公用表表达式(WITH
语句),但您可以使用普通子查询来完成。但实际上,当您想要使用分组数据(或PARTITION'ed,也就是说)时,ROW_NUMBER()
是一种祝福。
答案 1 :(得分:1)
你可以通过两次加入你的桌子来做到这一点。
select t1.id, t1.name, t1.dt
from t t1
inner join
(
select fkid, max(dt) as dt
from t
group by fkid
) t2
on t1.fkid = t2.fkid
and t1.dt = t2.dt
order by t1.id