根据日期创建具有不同值的表

时间:2013-02-28 13:38:16

标签: sql sql-server sql-server-2008 distinct

我有一张桌子,每月填写大量的交易,如下所示。

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

我如何实现这一目标?
我可以在一个查询中完成吗?

3 个答案:

答案 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

试图想办法摆脱分区功能而不引入可能的重复项。