0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SQLのみを用いた集団の集計行の突合比較

Last updated at Posted at 2020-07-11

全体の背景

この記事は集計行の比較をどうやってやろうかと考えた結果、アレコレ試行錯誤の結果となります。
一応、成功はしていますがいったん帰宅してから記憶から呼び起こしながら作成している為、精度は確実ではありません。
※確認したら上の内容を修正します。

注意

この記事はBIツールの都合上、SQL一本で突合比較を行おうとしております。一般的な場合、集計をSQL、比較はPython、Javaなどの手続き型言語で行うことを推奨します。
ホントに推奨かは知らないけど…
比較やったことないからなあ。
やりやすさと引継ぎやすさは後者が上だと思うけど

再度注意

この投稿主は毎度、後輩から「説明を抜かさないでください」と叱られております。この記事も抜けている箇所がある気がしますのでご指摘お願いします。

全体的な試行錯誤

1.シンプルだけど排泄物重かった
2.書籍に書いてあった集計行の出力
3.集計行の比較(ここから本題)

シンプルだけど排泄物重かった

こちらは3秒で脳内却下しました。
やるならもうちょっと上手くやれるでしょう。

パフォーマンスもそうですが、データの過剰集計がないとも言い切れない点が非常に好みじゃないデスね。


select 
  集計単位
  ,特徴A
  ,特徴B
  ・
  ・
  ・
  ,特徴z
from
(select 集計単位,sum(特徴A) 
from 巨大テーブルA
group by 集計単位)特徴A

left outer join
(select 集計単位,sum(特徴B) 
from 巨大テーブルb
group by 集計単位)特徴B



書籍に書いてあった集計行の出力

この辺りの書籍をご覧になるのが、早いと思います。一緒にSQL沼に堕ちよう〜
達人に学ぶSQL徹底指南書
https://www.amazon.co.jp/dp/B00DIM6330/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

個人的には、集計のラベル張りさえ間違えなければ、集団のサマリーの関係性が崩れない点がサイコーに好きです。エクセルで言うところのsumifができる点ですね。

select
  集計単位
  ,sum(case when 特徴A then 特徴 else 0 end)特徴A
  ,sum(case when 特徴B then 特徴 else 0 end)特徴B
  ・
  ・
  ・
from
  巨大テーブルA
where
  いつ時点で有効

集計行の比較

ここから本題、
今回の内容は過去と現在の集計行の比較

可読性が下がるので、
先述した、『書籍に書いてあった集計行の出力』の内容については、ここでは集計SQLと呼称しますね。
では出力するためのフラグとしてdtimeを内部に持たせて、集計単位の増減があるかもしれないので
メインは集計単位のリストとします。

select
  集計単位リスト.集計単位
  --どの時点のデータを出力しているか判断する為出力
  ,dtime
  ,case when dtime='今' then 集計SQL(現在).特徴A
      when dtime='過去' then集計SQL(過去).特徴A 
  end as 特徴A
  ,case when dtime='今' then 集計SQL(現在).特徴B
      when dtime='過去' then集計SQL(過去).特徴B 
  end as 特徴B
  ・
  ・
  ・
from
  集計単位リスト
left outer join
  集計SQL(現在)
  ON 集計単位リスト=集計SQL(現在).集計単位
left outer join
  集計SQL(過去)
  ON 集計単位リスト=集計SQL(過去).集計単位

left outer join
--出力する内容をSQLが判断するようの内部種別
(select '今' as dtime
 UNION
 select '過去' as dtime)dtime

where
--特徴量が1種でも違うものがあるレコードを出力
case when 集計SQL(現在).特徴A<>集計SQL(過去).特徴A then 1 else 0 end
+
case when 集計SQL(現在).特徴B<>集計SQL(過去).特徴B then 1 else 0 end
+



<> 0

正直、文献探すヒマもWebを漁りにいくヒマもなかったんですよね。多分ある気がする。
あったら教えて下さい。
お願いします。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?