2

我有一张桌子,每个月都有很多交易,如下所示。

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

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

4

3 回答 3

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
于 2013-02-28T13:41:39.350 回答
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
于 2013-02-28T13:45:05.990 回答
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

试图想一种方法来摆脱分区函数而不引入可能的重复。

于 2013-02-28T14:22:29.283 回答