はじめに
MySQL8.0がリリースされたことにより、Window関数の利用が可能になりました。
Oracle、PostgreSQL、SQL Server等でも利用できる関数ですが、「難しそう」、「どういう場合に使えば良いか分からない」というイメージを持たれている方もいると思いますので、この記事ではシンプルにどのようなことができるのかを紹介していきます。
過去の記事でもWindow関数について分かりやすく記載しておりますので、確認されていない方は是非こちらの記事もご参照ください。
・MySQL8.0のWindow関数を分かりやすく紹介する(1.「集計関数×Window関数」のコラボ)
・MySQL8.0のWindow関数を分かりやすく紹介する(2.順位・連番の付け方(基本編))
・MySQL8.0のWindow関数を分かりやすく紹介する(3.順位・連番の付け方(発展編))
今回は第四弾として「そのデータの取り方は・・・」というお題で記載します。
前置きが少し長くなっておりますので、実装方法から確認したい方は『データ準備』の章から読んで頂ければと思います。
「モンテッソーリ式おもちゃ収納」から学ぶ1~3軍の分け方
さて「1軍、2軍・・・」という言葉を聞くと野球などのスポーツを思い浮かべる方もいると思いますが、
例えば服や食器、おもちゃなどの収納術においても、1軍、2軍・・・という言葉を使います。
「おや?Window関数の使い方はどうしたの??」・・・と思われる方もいると思いますが、ご心配なく!
まずは少し為になるおもちゃの話を交えつつ、
最終的にWindow関数を使用した場合、どうしたらデータを1~3軍に分けられるのか・・・
という流れで記述していきます。
おもちゃの現状と小さい子供への影響は?
近年人口は減少傾向にあるものの、実は玩具市場の売り上げは伸びています!
2023年度の日本国内の玩具市場規模は初めて1兆円を超え、過去最高を記録しています!!
なお、特に小さいお子さんがいる家庭で、おもちゃを使った子供の遊びというのは、
洞察力や創造力、集中力などと様々な力を養うことが出来るとされ、子供の可能性を広げるための重要な要素の1つとされています。
では「沢山のおもちゃを与える方が良いのか?」と思う方もいると思いますが・・・答えは「No」です。
沢山のおもちゃは子どもの遊びの質を低下させることに繋がります。 また、集中して遊べない子どもは少しでもその遊び方が難しいと感じた際、忍耐強く取り組むことができずに癇癪をおこしたり、他の子どもの遊びの邪魔をしたりします。 つまり、人間関係にも悪影響を及ぼすことにつながりかねません・・・
一方、おもちゃは少なく与えた方が、
「少ないものでどうやったら自分のやりたいことを実現できるか自分で考える癖がつき、
集中力が生まれ、一つのものを大事にする心が育ちやすい」というメリットがあります!
おもちゃの与え方と収納術
ほとんどの方はおもちゃで遊んだことがあると思いますが、
おもちゃは誕生日やクリスマスなどのイベントで増えていったと思います。
おもちゃが増えていくことは必然かもしれませんが、
与え方と収納術を覚えることで、少ないおもちゃを与え、子供の能力を伸ばすことができます!
そこで重要になってくるのがおもちゃの収納術です。
ポイントは「おもちゃを3つに分類」することです!以下のようにおもちゃを1~3軍に分類します。
軍 | 基準 | 収納 | ポイント |
---|---|---|---|
1 | よく遊んでいて、今後も遊びたいもの | 遊ぶおもちゃをリビングのおもちゃ棚などに配置 | 与えるおもちゃは0~3歳なら6〜10種類、3~6歳は10~15種類に絞る |
2 | 1軍ほど夢中ではないが、今後遊びたいもの | クローゼットや押し入れにしまう | 月に1,2回のローテーションで1軍のおもちゃと入れ替える候補 |
3 | 壊れていたり、簡単すぎる、好きじゃないもの | 2軍と分けてクローゼットや押し入れにしまう | 使えるおもちゃを捨てるのはもったいないと思う方は他の人にあげる |
分類毎におもちゃを分けた後、
与えるおもちゃは1軍のものを「0~3歳なら6〜10種類、3~6歳は10~15種類」に絞っておもちゃ棚などに置きます。
そして、月に1,2回のローテーションで1軍と2軍のおもちゃをいくつか入れ替えつつ、
興味が薄れたり壊れてしまったものは3軍に移します。
これだけで、子供は限られたおもちゃで遊ぶことができますね!
これは「モンテッソーリ式おもちゃ収納」と呼ばれており、
以下のサイトに、収納術やそれ以外にお子さんがいる家庭で役立つ内容が記載されていますので、興味ある方はご参考にして頂けると幸いです。
参考サイト:おもちゃ収納はモンテッソーリ式が正解!実践方法を徹底解説!
データ準備
まずはおもちゃと利用頻度(used)を登録したテーブルを用意しています。
実際ご自身の環境でデータを登録する場合は、サンプルのデータよりも、昔を思い出してよく遊んだもの、思い出に残っているものなどを登録してみても面白いかもしれませんね!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
mysql> #Create Table mysql> CREATE TABLE toys -> ( -> toys_name VARCHAR(50), -> toys_kana VARCHAR(50), -> used INT -> ); Query OK, 0 rows affected (0.01 sec) mysql> #Data Insert mysql> INSERT INTO toys( toys_name, toys_kana, used) VALUES -> ( 'picture book','Ehon', 153), -> ( 'stuffed toy','Nuigurumi', 48), -> ( 'block','Burokku', 89), -> ( 'puzzle','Pazuru', 31), -> ( 'coloring book','Nurie', 74), -> ( 'origami','Origami', 56), -> ( 'train','Densha', 20), -> ( 'car','Kuruma', 26), -> ( 'soap bubbles','Shabon-dama', 67), -> ( 'building blocks','Tsumiki', 170) -> ; Query OK, 10 rows affected (0.00 sec) Records: 10 Duplicates: 0 Warnings: 0 mysql> #confirmation mysql> select * from toys; +-----------------+-------------+------+ | toys_name | toys_kana | used | +-----------------+-------------+------+ | picture book | Ehon | 153 | | stuffed toy | Nuigurumi | 48 | | block | Burokku | 89 | | puzzle | Pazuru | 31 | | coloring book | Nurie | 74 | | origami | Origami | 56 | | train | Densha | 20 | | car | Kuruma | 26 | | soap bubbles | Shabon-dama | 67 | | building blocks | Tsumiki | 170 | +-----------------+-------------+------+ 10 rows in set (0.00 sec) |
1~3軍へデータの仕分けと取り方は?
ケース1:NTILE関数でデータの仕分けをする
まずはNTILE関数を利用して1~3軍に仕分けするケースです。
以下は「利用頻度(used)」の高い順に、3つのグループに分けますが、
もし4つのグループに分けたい場合は、「NTILE(3) → NTILE(4)」にするだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
mysql> select -> * -> , NTILE(3) OVER(ORDER BY used DESC) as group_id -> from toys; +-----------------+-------------+------+----------+ | toys_name | toys_kana | used | group_id | +-----------------+-------------+------+----------+ | building blocks | Tsumiki | 170 | 1 | | picture book | Ehon | 153 | 1 | | block | Burokku | 89 | 1 | | coloring book | Nurie | 74 | 1 | | soap bubbles | Shabon-dama | 67 | 2 | | origami | Origami | 56 | 2 | | stuffed toy | Nuigurumi | 48 | 2 | | puzzle | Pazuru | 31 | 3 | | car | Kuruma | 26 | 3 | | train | Densha | 20 | 3 | +-----------------+-------------+------+----------+ 10 rows in set (0.00 sec) |
補足としてランダムにグループ分けしたい場合は、
OVER句内を「ORDER BY RAND()」にすると実現できます。
以下の結果を確認頂くと1回目と2回目の結果が違っていることが分かります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
■1回目 mysql> select -> * -> , NTILE(3) OVER(ORDER BY RAND()) as group_id -> from toys; +-----------------+-------------+------+----------+ | toys_name | toys_kana | used | group_id | +-----------------+-------------+------+----------+ | soap bubbles | Shabon-dama | 67 | 1 | | building blocks | Tsumiki | 170 | 1 | | stuffed toy | Nuigurumi | 48 | 1 | | picture book | Ehon | 153 | 1 | | coloring book | Nurie | 74 | 2 | | block | Burokku | 89 | 2 | | puzzle | Pazuru | 31 | 2 | | origami | Origami | 56 | 3 | | train | Densha | 20 | 3 | | car | Kuruma | 26 | 3 | +-----------------+-------------+------+----------+ 10 rows in set (0.01 sec) ■2回目 mysql> select -> * -> , NTILE(3) OVER(ORDER BY RAND()) as group_id -> from toys; +-----------------+-------------+------+----------+ | toys_name | toys_kana | used | group_id | +-----------------+-------------+------+----------+ | puzzle | Pazuru | 31 | 1 | | car | Kuruma | 26 | 1 | | picture book | Ehon | 153 | 1 | | stuffed toy | Nuigurumi | 48 | 1 | | building blocks | Tsumiki | 170 | 2 | | block | Burokku | 89 | 2 | | coloring book | Nurie | 74 | 2 | | origami | Origami | 56 | 3 | | train | Densha | 20 | 3 | | soap bubbles | Shabon-dama | 67 | 3 | +-----------------+-------------+------+----------+ 10 rows in set (0.00 sec) |
ケース2:対象のデータを取得する
Window関数はSELECT句やORDER BY句でしか記述できないという制約がありますので、
前回の記事で「1位のデータ」の取得方法について紹介いたしましたが、同様にFROM句のサブクエリを利用することで対象のデータを取得することができます。
以下は「group_id=1」のデータを取得していますが、
仕組みが分かると結構簡単にSQLを記述できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
mysql> SELECT -> * -> FROM -> ( -> SELECT -> * -> , NTILE(3) OVER(ORDER BY used DESC) as group_id -> FROM -> toys main -> ) tmp -> WHERE -> tmp.group_id = 1; +-----------------+-----------+------+----------+ | toys_name | toys_kana | used | group_id | +-----------------+-----------+------+----------+ | building blocks | Tsumiki | 170 | 1 | | picture book | Ehon | 153 | 1 | | block | Burokku | 89 | 1 | | coloring book | Nurie | 74 | 1 | +-----------------+-----------+------+----------+ 4 rows in set (0.00 sec) |
まとめ
今回おもちゃの収納術について少し紹介しましたが、
気になる方は服や食器などの収納術も学びつつ、Window関数の使い方をもっと学び、
お部屋もSQLもスッキリすることを目指すのも面白そうですね!
余談ですが「部屋の掃除は心の掃除」と聞いたことがあります。
部屋をキレイにすることで頭の中も整理され、ストレス解消につながり、
さらに掃除をすることで気分転換になり、身体を動かすことでセロトニンが分泌されるので精神を落ち着かせることができます。
一気に掃除をすると疲れてしまいますので、まずは1日5分からピンポイントで掃除を行い、
気分が落ち着いたところで、Window関数を試し、さらなる効率Upを狙ってみるというのも良いかもしれませんね!