2013-05-09 44 views
2

我在價格表中的一組數據:比較表與自身得到更改的記錄

 
id date   price 
1 01/01/2001 100 
2 01/02/2001 100 
3 01/03/2001 200 
4 01/04/2001 200 
5 01/05/2001 300 
6 01/06/2001 300 
7 01/07/2001 100 
9 01/08/2001 100 
10 01/09/2001 200 
20 01/10/2001 100 


我想只有它的價格變動記錄:

 
id date   price 
1 01/01/2001 100 
3 01/03/2001 200 
5 01/05/2001 300 
7 01/07/2001 100 
10 01/07/2001 200 
20 01/10/2001 100 

我該怎麼辦它在SQL中只有一個查詢。謝謝!

MySQL的腳本:

 
CREATE TABLE prices (
    id int(11) NOT NULL AUTO_INCREMENT, 
    date date NOT NULL, 
    price int(11) NOT NULL, 
    PRIMARY KEY (id) 
) ENGINE=InnoDB; 

insert into prices(id,date,price) 
values (1,'2001-01-01',100), 
(2,'2001-01-02',100),(
3,'2001-01-03',200), 
(4,'2001-01-04',200), 
(5,'2001-01-05',300), 
(6,'2001-01-06',300), 
(7,'2001-01-07',100), 
(9,'2001-01-08',100), 
(10,'2001-01-09',200), 
(20,'2001-01-10',100); 

+0

也有類似的問題,曾經在此之前問? – Strawberry 2013-05-09 08:27:59

+0

我試圖搜索,但沒有發現像這個問題。 – zentut 2013-05-09 08:30:51

回答

1

試試這個:

SELECT * FROM prices 
WHERE id in (
    SELECT p.id from prices p 
    LEFT JOIN prices p1 
    ON (p1.id = (select max(id) from prices pp where pp.id < p.id)) 
    WHERE p.price != p1.price OR p1.price is null 
); 
+1

嗨尤金,你的解決方案只適用於上面的一組數據。如果id列存在間隙,則不起作用。謝謝! – zentut 2013-05-09 08:42:45

+0

嘗試固定代碼。 – Eugene 2013-05-09 09:07:30

+0

它的工作原理。謝謝! – zentut 2013-05-09 09:08:00

0

你會被requried到左邊使用自表連接。

SELECT * FROM prices 
WHERE id in (
    SELECT p2.id from prices p2 
    LEFT JOIN prices p3 
    ON (p3.id = (select max(id) from prices p4 where p4.id < p2.id)) 
    WHERE p2.price != p3.price OR p2.price is null 
); 

嘗試sqlfiddle

相關問題