2013-03-07 166 views
1

類似的行我有一個SQL查詢是這樣的:結合基於時間戳

SELECT Name, Text as Value, UpdateDate from A WHERE UserID = @userId 
UNION 
SELECT Name, STR(Value), UpdateDate FROM B WHERE UserID = @userId 

AB都可能會或可能不會有一個給定名稱的行。他們都有一個名字,我只希望我的結果集中有最新的一行。

目前我的結果集將是這個樣子:

Name | Value | UpdateDate 
Foo '23' Jan-1-2012 
Foo 'A'  Feb-7-2013 
Bar '42' Jan-3-2011 

而且我想凝結下來到:

Name | Value 
Foo 'A' 
Bar '42' 

我知道我可以在客戶端做這個很容易,但如果某種魔術可以在單個查詢中完成,它將會非常棒。希望它也不會太貴。

回答

4
WITH unionTB 
AS 
(
    SELECT Name, Text as Value, UpdateDate 
    from A WHERE UserID = @userId 
    UNION 
    SELECT Name, STR(Value), UpdateDate 
    FROM B WHERE UserID = @userId 
), 
recordList 
AS 
(
    SELECT Name, Value, UpdateDate, 
      ROW_NUMBER() OVER (PARTITION BY Name 
           ORDER BY UpdateDate DESC) rn 
    FROM unionTB 
) 
SELECT Name, Value, UpdateDate 
FROM recordList 
WHERE rn = 1