この記事は「データベーススペシャリスト資格に興味はあるが、どのようなものか?どう学ぶのか?」という方向けに、具体的な内容と私自身の挑戦ログをお伝えする。学び中の方や、これから学ぼうとされる方の参考になれば幸いだ。
今回はSQLによるデータ調査(サブクエリ例題)について書く。
※注意点として、SQLはDBMSによって作法が異なる。この記事はGoogle Big Queryに準拠するものであることをお含みおき願いたい。
作業記録とカレンダーから土日以外の休業日を調べる
前回振り返り
- SQLについて。現在は「仮想テーブル」を扱う操作のうち、最も柔軟に利用できる「サブクエリ」について学んでいる。前回はサブクエリの応用として、データ分析(特定商品の有無別に平均注文金額を比較)について学んだ。
- 今回はサブクエリをより実践的に習得するため、データ調査の例題を解く。
サンプルの紹介
- 以下のような、作業記録のテーブル(small_workdata)および6月のカレンダー(small_cal)を対象にする。
- 作業記録のテーブルは、各部屋(101号室~105号室)の作業を、いつからいつまで行ったかを管理している。
- この2つのテーブルを用いて、「6月中に、土日以外で作業が行われない日はあるか。それは何日か?」を調査してみる。
<6月のカレンダー(small_cal)テーブル>
SQL実践(試行)
- さて、仮に問題を簡単にして、「6/1~6/5に含まれない、6月中の日付を求めよ」ならどうやるか。
- 最もシンプルなのは、where句を用いてカレンダーテーブルから「dateが6/1~6/5以外」で絞り込むもの。ただしこの記述だと、つど日付を記述・修正する必要があり面倒。
- よって、以下のように「101号室の作業開始日・終了日」をサブクエリで抽出し、それをwhere句の条件に使用してみる。結果は6/6~6/30が取得できたので、答えとして合ってはいる。
SQL実践(テーブルの交差結合)
- 理論上は上記のとおり求めたテーブルを、102号室、103号室…と続けていけば絞り込みはできる。ただし、SQLがとても煩雑になってしまう。
- そこで、cross joinを使って両テーブルを繋げてしまい、そのテーブルにおいてフラグを立てて、あとから集計する方法に切り替える。
- このように、複数のテーブルにまたがる調査を行う際は、いったんテーブルを結合し、そのテーブル内で演算としたほうがわかりやすくシンプルになることが多い。
- 具体的には、まず以下のとおりcross joinを設ける。これで「カレンダーの6/1~6/30の日付のそれぞれに、101~105号室の情報がぶら下がる」形ができた。
SQL実践(フラグ立て)
- 次に、各行において「開始日と終了日の間なら作業日(1)、そうでないなら非営業日(0)」のフラグを立てる。
- SQLは以下のとおり。cross joinしたテーブルをサブクエリとして引き込み、dateの日付が開始日~終了日の間にフラグに1を立てる。(以下赤枠)
- このように、テーブル内で調査をする際は、目的に沿ったフラグをテーブルに追加するとわかりやすく処理しやすい。
SQL実践(グループ化とリスト化)
- ここまで出来たら、あとはデータをdateで束ねて(group by)、フラグが0のものを抜き出すだけ。
- SQLは以下のとおり。group byは集計関数を用いるので、「フラグが1」の条件にmax関数を用いていることはポイント。
- 結果として、6月中の土日以外の「作業してない日」は6月17日と18日だとわかった。
- これは練習でデータ量が少ないので「エクセルの方が早いし簡単だよ」と感じられると思う。実際、私も答えが合っているかの添削はエクセルを使っている。
- ただ、大量のデータを素早く処理・加工するためSQLを学んでいるということは、あらためて認識しておきたい(データが大量だとエクセルでは管理しきれないし、BIツールでは処理が重くなるからだ)
SQLにおいて重要と感じること(再掲)
- 一つ一つの要素はシンプルかつ簡単。例えば上で実践したSQLも最後だけ見るとよく分からないが、過程の積み重ねを見れば一つ一つは簡単であることが分かる。
- 実際に手を動かすことが大事。初めてSQLを学んだときは「SQLは言語だから」くらいの理由で納得していた。しかし手を動かすことの真意は「作っていて楽しく、その楽しさが継続につながる」からだと、今ならわかる。
- 学びやすい環境を選ぶこと。あらためてテーブルやクエリを直感的に管理できるBig Queryの便利さを痛感している。例えば上で実践したSQLも、個々用意したクエリを都度コピペし書き加えているだけ。クエリのシート管理(以下赤枠)とコピペの容易さ(以下青枠)は、特にサブクエリと非常に相性が良い。
考察
- SQLについて。現在は「サブクエリ」について学んでいる。今回は知識を知恵にするため、実践をイメージした例題を解いた。例題は「作業記録とカレンダーという2つのテーブルを用いて、休業日を調査せよ」であり、結合・グループ化・絞り込みなどの復習も行えた。
- 考察。不自由・不明確な仕事で心身のバランスを崩しそうなときは、第三者(医療機関や家族)に相談し早めに休息をとることが重要だ。我々は幸せになる権利があり、自分の人生を自分で決められるという「当たり前のこと」を忘れないようにしたい。
考察のシンプル化と英訳(練習中)
- We have the right to be happy. and, We can decide our own life. I try not to forget this obvious thing.
- (私たちには幸せになる権利があります。そして、自分の人生を決めることができます。私はこの明白なことを忘れないようにしています)
参考書籍
- 集中演習 SQL入門/木田和廣/株式会社インプレス
コメント