[SQL Server]データテーブル内最新の情報のみを表示させる
今回の記事はSQLserver内での記述です。
まず状況の説明です。
データベースのテーブルには
primarykey(主キー:データを識別するコードなど被らないもの)
が2つ設定されている(複合キー)前提です。
一つはコード、一つはseq(シーケンス番号という)。
過去の情報も維持したい場合などにコードのみではなく、シーケンス番号も使います。
データベースのテーブル↓
コード seq その他データ・・・・・
001 1 --- --- ---
001 2 --- --- ---
過去の情報も維持すると、このようにコードが被ります。
普通はコードでレコード(1行)を識別するので、被るとエラーになります。
seqは新しい情報ほど数が大きくなるように登録される前提で、
コードが被っても登録できるように複合キーにしているわけです。
こういった状況での、
最新のデータのみを表示させたい場合のselect文です。
例
テーブル名 テストテーブル
コード seq その他データ・・・・・
001 1 --- --- ---
001 2 --- --- --- の場合
002 1 --- --- ---
コメント
細かい解説は後日します。説明編の記事
流れは、from句の()内(サブクエリ)で、group by でコードごとにseqのMAX値を出すだけのテーブルを作ります。のちにそのテーブルtestに元のテーブルtest2を複合キーによって結合(left join)して、その他のデータを表示させるというものです。
まず状況の説明です。
データベースのテーブルには
primarykey(主キー:データを識別するコードなど被らないもの)
が2つ設定されている(複合キー)前提です。
一つはコード、一つはseq(シーケンス番号という)。
過去の情報も維持したい場合などにコードのみではなく、シーケンス番号も使います。
データベースのテーブル↓
コード seq その他データ・・・・・
001 1 --- --- ---
001 2 --- --- ---
過去の情報も維持すると、このようにコードが被ります。
普通はコードでレコード(1行)を識別するので、被るとエラーになります。
seqは新しい情報ほど数が大きくなるように登録される前提で、
コードが被っても登録できるように複合キーにしているわけです。
こういった状況での、
最新のデータのみを表示させたい場合のselect文です。
例
テーブル名 テストテーブル
コード seq その他データ・・・・・
001 1 --- --- ---
001 2 --- --- --- の場合
002 1 --- --- ---
select test.コード, test.seq, test2.その他のデータ1,test2.その他のデータ2・・・・
from (select コード,max(seq) as seq
from テストテーブル
group by コード) as test
left join テストテーブル as test2 on
test.コード = test2.コード and test.seq = test2.seq
order by convert (integer, test.コード)
結果下のように表示されます。
コード seq その他データ・・・・・
001 2 --- --- ---
002 1 --- --- ---
order by convert (integer, test.コード)
結果下のように表示されます。
コード seq その他データ・・・・・
001 2 --- --- ---
002 1 --- --- ---
コメント
細かい解説は後日します。説明編の記事
流れは、from句の()内(サブクエリ)で、group by でコードごとにseqのMAX値を出すだけのテーブルを作ります。のちにそのテーブルtestに元のテーブルtest2を複合キーによって結合(left join)して、その他のデータを表示させるというものです。
コメント
コメントを投稿