如何使用TSQL获得所需的结果集?

时间:2012-07-10 14:35:07

标签: sql-server-2008 tsql

这是我的表结构: -

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我需要按最新的日期时间选择排队。请指点。

2 个答案:

答案 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

请参阅SQL Fiddle with Demo