我有一个像这样的SQL查询:
SELECT Name, Text as Value, UpdateDate from A WHERE UserID = @userId
UNION
SELECT Name, STR(Value), UpdateDate FROM B WHERE UserID = @userId
表A
和B
可能也可能没有给定名称的行。如果它们都有一个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
魔法可以在单个查询中完成它,那真的很棒。希望它也不会太贵。
答案 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