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 を持つディメンション テーブルを作成したいと考えています。問題は、上の例の「ジョン」のように、人が自分の名前を変更できることです。それ以外の場合、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 に答える