web-dev-qa-db-ja.com

インクリメントされた値で列を追加/更新し、SQLの別の列に基づいてその値をリセットする方法

私は困惑しています。ブラウザのタブに閉じるボタン( "X")が表示されなくなるまで検索して調べました。検索語を何度も書き換えてみましたが、何を質問したらよいかわからないので、すでに回答済みの場合はお詫びします。

に基づいて開始し、1ずつ増加するテーブルにINT列を追加する方法を理解しようとしています(このフィールドversionと呼びます)に基づいて別の列の値(これをcase_idと呼びます)その値が以前に反復された行と同じである場合-同じでない場合、 versionの値を1にリセットする必要があります。

私が作成した一時テーブルを更新するか、SELECT INTOステートメントの実行中に値を追加することで、それを理解しようとしました。

このテーブルの目的は、case_id列で識別されるケースの履歴更新のレコードを、このバージョンの値と同じ順序で格納することです変更タイムスタンプとして。

このテーブル構造をソースデータの例として考えてください:

---------------------------------
| case_id | modify_time         |
---------------------------------
| 1       | 2015-05-01 11:12:13 |
| 1       | 2015-05-02 12:13:14 |
| 1       | 2015-05-03 13:14:15 |
| 2       | 2015-05-01 11:12:13 |
| 2       | 2015-05-01 12:13:14 |
| 3       | 2015-05-02 11:12:13 |
---------------------------------

これを私が最終結果として達成したいことの例として考えてください:

-------------------------------------------
| case_id | modify_time         | version |
-------------------------------------------
| 1       | 2015-05-01 11:12:13 | 1       |
| 1       | 2015-05-02 12:13:14 | 2       |
| 1       | 2015-05-03 13:14:15 | 3       |
| 2       | 2015-05-01 11:12:13 | 1       |
| 2       | 2015-05-01 12:13:14 | 2       |
| 3       | 2015-05-02 11:12:13 | 1       |
-------------------------------------------

ご覧のとおり、version(INT)列を追加し、に基づいて増分値を挿入する必要がありますmodify_time(昇順)case_id値が変更されるとリセットされます。

検索中につまずいたことをいくつか試しましたが、これを理解するのに役立つものは何もありませんでした。

これは私には少し高度すぎると思います。:-(これはSQL Server 2012で、この演習からしか学べないので、どんなに高度なものでも何でも試すことを恐れません。

時間を割いて私の質問をご覧いただき、ありがとうございます。ここで私を手伝っていただければ幸いです。乾杯。

1
metcaelfe

この列は簡単に保守できます。

;WITH x AS 
(
  SELECT case_id, modify_time, version, 
    rn = ROW_NUMBER() OVER (PARTITION BY case_id ORDER BY modify_date)
  FROM dbo.source_table
)
UPDATE x SET version = rn WHERE version <> rn;

しかし、クエリを実行する必要があるたびにそのバージョン列をオンザフライで生成することもできるので(ビューにある可能性があります)、出力を保存したり、テーブルにバージョン列を置いたりするメリットはありません。読み取るよりも頻繁に更新する可能性があります(行が変更または追加されるたびに、範囲全体またはテーブル全体を更新する必要があります)。

あるシステムから別のシステムへ、またはあるテーブルから別のテーブルへデータを移動する場合、まだこの列がソーステーブルに存在する必要はありません、および必要ありませんこの列を保存する一時テーブル

INSERT dbo.target_table(case_id, modify_time, version)
SELECT case_id, modify_time, version = ROW_NUMBER() OVER
  (PARTITION BY case_id ORDER BY modify_date)
FROM dbo.source_table;
4
Aaron Bertrand