同じテーブル内の別の行から値を計算する
最後に、
Stocks:株価テーブル
brand | sale_ | price |
---|---|---|
A鉄鋼 | 2008-07-01 | 1000 |
A鉄鋼 | 2008-07-04 | 1200 |
A鉄鋼 | 2008-08-12 | 800 |
B商社 | 2008-06-04 | 3000 |
B商社 | 2008-09-11 | 3000 |
C電気 | 2008-07-01 | 9000 |
D産業 | 2008-06-04 | 5000 |
D産業 | 2008-06-05 | 5000 |
D産業 | 2008-06-06 | 4800 |
D産業 | 2008-12-01 | 5100 |
brand | sale_ | price | trend |
---|---|---|---|
|
trendは前回の終値と今回の終値を比較して、
brand | sale_ | price | trend |
---|---|---|---|
A鉄鋼 | 2008-07-01 | 1000 | |
A鉄鋼 | 2008-07-04 | 1200 | ↑ |
A鉄鋼 | 2008-08-12 | 800 | ↓ |
B商社 | 2008-06-04 | 3000 | |
B商社 | 2008-09-11 | 3000 | → |
C電気 | 2008-07-01 | 9000 | |
D産業 | 2008-06-04 | 5000 | |
D産業 | 2008-06-05 | 5000 | → |
D産業 | 2008-06-06 | 4800 | ↓ |
D産業 | 2008-12-01 | 5100 | ↑ |
今度は既存の行に対する更新ではなく、
INSERT INTO Stocks2
SELECT brand, sale_date, price,
CASE SIGN(price -
(SELECT price
FROM Stocks S1
WHERE brand = Stocks.brand
AND sale_date =
(SELECT MAX(sale_date)
FROM Stocks S2
WHERE brand = Stocks.brand
AND sale_date < Stocks.sale_date)))
WHEN -1 THEN '↓'
WHEN 0 THEN '→'
WHEN 1 THEN '↑'
END
FROM Stocks;
SIGN関数は引数の値の正・
INSERTを使用するメリット、デメリット
同じ要領で、
反対に、
おわりに
私たちが日常SQLでデータベースを扱う際に発生する問題の半分は、
しかし、
参考資料
- J.セルコ
『SQLパズル 第2版』 (翔泳社、 2007、 ISBN:978-4-7981-1413-2) UPDATE文での相関サブクエリの応用については、
「パズル4 入館証」、 「パズル18 ダイレクトメール」、 「パズル38 記録の更新」 が格好の演習になるでしょう。また、 「SELECT文をあれこれひねるよりも、 テーブル設計を見直せ」 という言葉の重要性を体感できる実例としては、 「パズル8 プリンタの割り当て」、 「パズル17 人材紹介会社」、 「パズル24 10個のうち1つだけ」、 「パズル39 保険損失」 など。 - ミック
『達人に学ぶ SQL徹底指南書』 (翔泳社、 2008、 ISBN:978-4-7981-1516-0) 更新SQLと組み合わせることで大きな効力を発揮するCASE式と相関サブクエリの基本については、
「1-1. CASE式のススメ」、 「1-6. 相関サブクエリで行と行を比較する」 を参照。また、 相関サブクエリにおける自己参照のイメージをつかみたければ、 「1-2. 自己結合の使い方」 をどうぞ。 - J.セルコ
『プログラマのためのSQL 第2版』 (ピアソン・ エデュケーション、 2001、
ISBN:978-4-8947-1480-9) リスト機能については
「10. 2 SQL-92における行の比較」 を参照。リスト比較は、 より一般的には行全体を操作単位とする行比較としてとらえられます。