アウトプットができる技術者に

it's a time to take a new step !

SQL Tips N-1のデータを取得する

実行環境:MySQL 5.1

select * from items;
+------+------------+-------+
| code | date       | price |
+------+------------+-------+
| 001  | 2014-01-01 |   100 |
| 001  | 2014-01-02 |   101 |
| 001  | 2014-01-04 |   102 |
| 001  | 2014-01-05 |   103 |
| 002  | 2014-01-01 |   200 |
| 002  | 2014-01-02 |   201 |
| 002  | 2014-01-04 |   202 |
| 002  | 2014-01-05 |   203 |
+------+------------+-------+

select a.code, a.date, b.date preDate, a.price, b.price as prePrice
from item a, item b
where 
       a.code = b.code
 and b.date = (select max(date) from item where date < a.date and code = a.code)
+------+------------+------------+-------+----------+
| code | date       | preDate    | price | prePrice |
+------+------------+------------+-------+----------+
| 001  | 2014-01-02 | 2014-01-01 |   101 |      100 |
| 001  | 2014-01-04 | 2014-01-02 |   102 |      101 |
| 001  | 2014-01-05 | 2014-01-04 |   103 |      102 |
| 002  | 2014-01-02 | 2014-01-01 |   201 |      200 |
| 002  | 2014-01-04 | 2014-01-02 |   202 |      201 |
| 002  | 2014-01-05 | 2014-01-04 |   203 |      202 |
+------+------------+------------+-------+----------+

準備用のScript

#!/bin/sh
 q(){
     mysql -uroot -proot -Dtest_db -e "$*"
 }
 
 q "drop table item"
 q "create table item(code varchar(10), date date, price int(10))"
 q "insert into item (code, date, price) values ('001','2014-01-01', 100)"
 q "insert into item (code, date, price) values ('001','2014-01-02', 101)"
 q "insert into item (code, date, price) values ('001','2014-01-04', 102)"
 q "insert into item (code, date, price) values ('001','2014-01-05', 103)"
 q "insert into item (code, date, price) values ('002','2014-01-01', 200)"
 q "insert into item (code, date, price) values ('002','2014-01-02', 201)"
 q "insert into item (code, date, price) values ('002','2014-01-04', 202)"
 q "insert into item (code, date, price) values ('002','2014-01-05', 203)"