我有一张桌子,每月填写大量的交易,如下所示。
Name ID Date OtherColumn
_________________________________________________
John Smith 11111 2012-11-29 Somevalue
John Smith 11111 2012-11-30 Somevalue
Adam Gray 22222 2012-12-11 Somevalue
Tim Blue 33333 2012-12-15 Somevalue
John NewName 11111 2013-01-01 Somevalue
Adam Gray 22222 2013-01-02 Somevalue
从这张表中我想创建一个具有唯一名称和ID的维度表。问题是一个人可以改变他/她的名字,比如上面例子中的“John”。 Id也是独一无二的。在这些情况下,我只想使用最新的名称(具有最新日期的名称)。
所以我最终得到了这样一个表:
Name ID
______________________
John NewName 11111
Adam Gray 22222
Tim Blue 33333
我如何实现这一目标?
我可以在一个查询中完成吗?
答案 0 :(得分:2)
为此使用CTE。它简化了排名和窗口功能。
;WITH CTE as
(SELECT
RN = ROW_NUMBER() OVER (PARTITION BY ID ORDER BY [Date] DESC),
ID,
Name
FROM
YourTable)
SELECT
Name,
ID
FROM
CTE
WHERE
RN = 1
答案 1 :(得分:1)
我认为创建表格是一个坏主意,但这就是你获得最新名称的方式。
select name
from yourtable yt join
(select id, max(date) maxdate
from yourtable
group by id ) temp on temp.id = yt.id and yt.date = maxdate
答案 2 :(得分:0)
JNK的CTE
解决方案等同于以下内容。
SELECT
Name,
ID
FROM (
SELECT
RN = ROW_NUMBER() OVER (PARTITION BY ID ORDER BY [Date] DESC),
Name,
ID
FROM theTable
)
WHERE RN = 1
试图想办法摆脱分区功能而不引入可能的重复项。