2013-03-07 107 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