0

私は単純化されたテーブルを持っています:

id     date     color
----------------------
1   2012-01-01  black
2   2012-01-02  red
3   2012-01-03  red
4   2012-01-04  red
5   2012-01-05  green

次に、このテーブルから新しいテーブルに色の変更を挿入する必要があります。

   date     before   now
----------------------------
2012-01-02  black    red
2012-01-04  red      green      

誰か教えてください。

4

3 に答える 3

3

2 行目を前の行と比較します。

SELECT cur.date, prev.color "before", cur.color now
FROM tbl cur
LEFT JOIN tbl prev ON cur.id = prev.id + 1
WHERE cur.id > 1 -- start detecting changes from second row
     AND prev.color <> cur.color

ライブ テスト: http://sqlfiddle.com/#!2/0c146/1

編集

連続していないデータでも機能します。MySQL に CTE 機能がある場合、クエリはより簡潔になる可能性があります

create table tbl
(
  id int, 
  date date,
  color text
);


insert into tbl(id,date,color)
select 1,'2012-1-1','black' union
select 2,'2012-1-3','red' union
select 3,'2012-1-7','red' union
select 4,'2012-1-15','red' union
select 5,'2012-1-21','green' ;


set @rx = 0;
set @ry = 0;


select cur.date, prev.color as "before", cur.color as "now"

from (select *, @ry := @ry + 1 as series from tbl order by date) as cur 
left join (select *, @rx := @rx + 1 as series from tbl order by date) as prev
on cur.series = prev.series + 1

where cur.series > 1
and prev.color <> cur.color

ライブ テスト: http://sqlfiddle.com/#!2/b9443/2

于 2012-04-19T15:25:30.743 に答える
0

私の理解が正しければ、ストアド プロシージャが必要です。

ストアド プロシージャ

于 2012-04-19T15:21:38.897 に答える
0

まず、color列の名前を変更 ->beforeし、次に列を追加しnow(default null可能な場合)、必要に応じて列を更新しnowます。

于 2012-04-19T15:17:51.193 に答える