FROM句にテーブルを並べて、前日比を求めるクエリです。
「昨日の日付に値を結び付けてJOIN句で…」と考えがちですが、FROM句を使う方法が簡単です。
日付をずらすためにDATE_ADD関数を使って1日分だけ先送りします。あとはWHERE句で結び付けてSELECT句で引き算すると前日比が出てきます。
前日比を求める考え方
一日前の日付に値を結び付けたテーブルをJOINして求める方法を考えると思います。しかし、クエリがちょっと複雑になりそうな予感がします。
イメージしやすい単純な方法は、今日と昨日のテーブルを2つ並べて値を引く。
このイメージどおりのやり方が、FROM句にテーブルを並べる方法です。
前日比(差分)は、昨日の値に今日の日付を持たせて結び付け、その値を今日の値から引く。という考え方になります。
前日比を求めるクエリ
日付け, 人数 のデータを使って、前日比を求めるクエリを書いてみます。
SELECT *, people - i_people AS '前日比'
FROM tbl, (
SELECT DATE_ADD(daydate, INTERVAL 1 DAY) AS i_date, people AS i_people
FROM tbl) AS i_tbl
WHERE daydate = i_date;
FROM句には、元となるtblテーブルと、日付を1日分ずらしたテーブルを並べます。
日付をずらしたテーブルには、昨日の値に今日の日付を持たせたいので、日付を一日分だけ先送りさせます。日付を先送りするためにDATE_ADD関数を使います。INTERVAL 1 DAYとすると1日分の日付を増やせます。
そして、元となるtblテーブルと日付をずらしたi_tblを、WHERE句で結び付けます。
このクエリの結果は、前日比(差分)がばっちり出てきます。
日付を足すDATE_ADD、引くDATE_SUB
SELECT DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY); -- 明日 2020-04-02
SELECT CURRENT_DATE(); -- 今日 2020-04-01
SELECT DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY); -- 昨日 2020-03-31
まとめ
- やり方としてイメージしやすい単純な方法は、今日と昨日のテーブルを2つ並べて値を引く。
- FROM句には、元となるtblテーブルと、日付を1日分ずらしたテーブルを並べる。
- 日付を先送りするためにDATE_ADD関数を使う。
- 元となるtblテーブルと日付をずらしたi_tblを、WHERE句で結び付ける。
開発現場で効率的に動くために有効なのは、解決策のパターンを経験として増やすことです。SQLのパターンは、やりたいことを逆引きできるこの本が強力です。
リンク