根据时间戳组合相似的行

时间:2013-03-07 16:56:15

标签: sql sql-server-2008 group-by

我有一个像这样的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,我只希望我的结果集中包含最新的行。

目前我的结果集看起来像这样:

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

我想将其浓缩为:

Name | Value
Foo    'A'
Bar    '42'

我意识到我可以在客户端中相当容易地做到这一点,但如果某种Group-By魔法可以在单个查询中完成它,那真的很棒。希望它也不会太贵。

1 个答案:

答案 0 :(得分: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