見出し画像

SQLを計画ツールとして使う

こんにちは。コグラフ株式会社データアナリティクス事業部の塩見です。
この記事では、倉庫から工場までの商品配送スケジュールを計画するツールとしてSQLを使う方法を説明します。祝日がからんだり、関係者が増えるとスケジュール作成はどんどん大変になっていきますが、それを自動化することができます。


稼働日テーブルを作成する

2/8(木)から2/14(水)までの一週間を考えます。倉庫の休みは2/10(土)、2/11(日)です。工場の休みは2/11(日)です。休みを除いた稼働日だけのテーブル「倉庫」とテーブル「工場」を作成しておきましょう。

稼働日テーブル:「倉庫」と「工場」

実行可能な配送スケジュールを計算する

稼働日テーブルが整備された段階で、商品の配送スケジュールを詳細に計画しましょう。出荷された商品は倉庫から出発し、翌稼働日には目的地の工場に到着するものとします。例えば、倉庫から2/8(木)に商品を発送した場合、工場への到着日は2/9(金)となります。この際、倉庫の稼働日が工場の稼働日よりも前であるという条件が成り立ちます。この条件を満たす配送スケジュールをSQLを用いて計算してみましょう。

SELECT
     倉庫.稼働日 AS 倉庫出荷日
    ,工場.稼働日 AS 工場到着日
FROM 倉庫
CROSS JOIN 工場
WHERE 倉庫.稼働日 < 工場.稼働日

CROSS JOINはすべての組み合わせを取得する結合演算です。つまりこのSQLは倉庫と工場のすべての組み合わせを最初に考えて、そこから倉庫の稼働日 < 工場の稼働日という条件をみたす組み合わせだけにしぼっています。結果は以下のようになります。

実行可能な配送スケジュール(倉庫稼働日 < 工場稼働日)

出荷日はできるだけ遅くする

得られた実行可能な配送スケジュールをよく見ると、倉庫出荷日が早すぎるような結果も含まれています。工場到着日が同じなら、倉庫出荷日はできるだけ遅い方を選ぶようSQLを書き換えれば完成です。

SELECT
     MAX(倉庫.稼働日) AS 倉庫出荷日
    ,工場.稼働日 AS 工場到着日
FROM 倉庫
CROSS JOIN 工場
WHERE 倉庫.稼働日 < 工場.稼働日
GROUP BY 工場.稼働日
完成した配送スケジュール

SQLを使うと何がよいのか

出荷日から到着日を求める順方向のロジックを考えるだけで、逆方向の到着日から出荷日を求めるロジックも同時に完成しました。テーブルというデータ構造は関係とも呼ばれ、列から列へお互い双方向に参照できるというよい性質があります。つまりA列の値がわかればB列の値がわかりますし、その逆も成り立つのです。宣言的に記述するので処理にもれがないと確信できるのもメリットです。

SQLと人工知能言語Prolog

現在の人工知能技術は、大規模なデータから自動的に学習する手法が発展しています。しかし、かつてはデータベースを論理的に探索する手法が主流であり、その中でPrologは強力なプログラミング言語として活躍しました。Prologは双方向の計算が可能であり、「aとbからcが求められる」という定義を記述するだけで、「cを求めるにはaと何が必要か」といった質問にも答えることができるという特徴を持っています。

Prologの高度な機能をいくつか取り除いたものとSQLは、同じ表現力を持っています。実はSQLは、Prologのサブセットと見なすことができるのです。SQLでもPrologの推論機能の一部を再現できると思ったことが、配送スケジュール自動作成を考えるきっかけとなりました。

私はこのプログラムを実務で利用し、配送スケジュールだけでなく、バッチ処理のスケジュール作成にも活用していました。

参考情報
Prolog as a Database Query Langauge
宣言型プログラミングの可能性と限界

データ分析に興味のある方募集中!

コグラフ株式会社データアナリティクス事業部ではPythonやSQLの研修を行った後、実務に着手します。
研修内容の充実はもちろん、経験者に相談できる環境が備わっています。
このようにコグラフの研修には、実務を想定し着実にスキルアップを目指す環境があります。
興味がある方は、下記リンクよりお問い合わせください。

X(Twitter)もやってます!

コグラフデータ事業部ではX(Twitter)でも情報を発信しています。
データ分析に興味がある、データアナリストになりたい人など、ぜひフォローお願いします!

この記事が参加している募集

仕事について話そう

この記事が気に入ったらサポートをしてみませんか?