しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

差分のみの DB テーブルから最新の情報を SQL で問い合わせてみる

例えば下記のようなテーブルがあった場合に、そのまま利用してもいいですが更新処理を効率化するために差分のみを用意することを考えてみます

2014 年 4 月のブログ投稿記事カテゴリー内訳(BlogTags テーブル)

f:id:matatabi_ux:20140603004716p:plain

こんな感じに

f:id:matatabi_ux:20140603004909p:plain

この場合、任意の投稿日時点の状況を次のような SQL で問い合わせることができます

SELECT
   MAX([投稿日付]) '投稿日付', MAX([MVPVM]) 'MVPVM', MAX([猫]) '猫', MAX([その他]) 'その他'
  FROM
   [dbo].[BlogTags]
  WHERE
   [投稿日付] < DATEFROMPARTS(2014,04,20);

問い合わせ結果はこの通り

f:id:matatabi_ux:20140603005657p:plain

ただ、これだとカテゴリーが増えたときにデータ更新がめんどくさいのでさらにテーブル構成を次のように変更します

f:id:matatabi_ux:20140603005837p:plain

問い合わせを次のように変更すると

SELECT
 X.[投稿日付] '投稿日付', X.[分類] '分類', X.[値] '値'
FROM
 [dbo].[BlogTags2] X
 INNER JOIN
 (SELECT
   MAX(投稿日付) '投稿日付', [分類]
  FROM
   [dbo].[BlogTags2]
  WHERE
   [投稿日付] < DATEFROMPARTS(2014,04,20)
  GROUP BY
   [分類]) Y
 ON
  X.[投稿日付] = Y.[投稿日付] AND X.[分類] = Y.[分類];

ほぼ同じ結果が得られました

f:id:matatabi_ux:20140603012052p:plain