另一种方法,即使在不连续的日期也可以工作:
源数据:
CREATE TABLE fluctuate
(Date datetime, Company varchar(10), Price int);
INSERT INTO fluctuate
(Date, Company, Price)
VALUES
('2012-01-04 00:00:00', 'Apple', 458),
('2012-01-03 00:00:00', 'Apple', 462),
('2012-01-02 00:00:00', 'Apple', 451),
('2012-01-01 00:00:00', 'Apple', 450),
('2012-01-01 00:00:00', 'Microsoft', 1),
('2012-01-03 00:00:00', 'Microsoft', 7),
('2012-01-05 00:00:00', 'Microsoft', 5),
('2012-01-07 00:00:00', 'Microsoft', 8),
('2012-01-08 00:00:00', 'Microsoft', 12);
输出:
DATE COMPANY PRICE DAY_CHANGE
January, 04 2012 Apple 458 -4
January, 03 2012 Apple 462 11
January, 02 2012 Apple 451 1
January, 01 2012 Apple 450 NULL
January, 08 2012 Microsoft 12 4
January, 07 2012 Microsoft 8 3
January, 05 2012 Microsoft 5 -2
January, 03 2012 Microsoft 7 6
January, 01 2012 Microsoft 1 NULL
询问:
select
date,
company,
price,
day_change
from
(
select
case when company <> @original_company then
-- new company detected,
-- reset the original price based on the new company
@original_price := null
end,
f.*,
price - @original_price as day_change,
(@original_price := price),
(@original_company := company)
from fluctuate f
cross join
(
select
@original_price := null,
@original_company := company
from fluctuate
order by company, date limit 1
)
as zzz
order by company, date
) as yyy
order by company, date desc
来源:http ://www.sqlfiddle.com/#!2/56de3/3