2012-07-10 61 views
0

這裏是我的表結構: -如何使用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我需要挑選最新的日期時間排成一行。請任何指導。

回答

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語句),但你可以用正常的子查詢做到一樣好。但是真的,ROW_NUMBER()是一個祝福,當你想與分組數據(或PARTITION'ed,這麼說)工作。

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