我希望每天都能获得Price的变化。什么SQL查询将实现此目的?
原始表
Date Company Price
---------------------------
1/4/2012 Apple 458
1/3/2012 Apple 462
1/2/2012 Apple 451
1/1/2012 Apple 450
所需表
Date Company Price Day_Change
-------------------------------------
1/4/2012 Apple 458 -4
1/3/2012 Apple 462 9
1/2/2012 Apple 451 1
1/1/2012 Apple 450 NULL
答案 0 :(得分:2)
另一种方法即使在非连续日期也能正常工作:
来源数据:
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
答案 1 :(得分:1)
加入桌子以获得公司昨天的价格,然后从今天的价格中扣除
select
t1.date,
t1.company,
t1.price,
t1.price - t2.price as day_change
from price_table t1
left join price_table t2
on t2.date = subdate(t1.date, 1)
and t2.company = t1.company
在此之后,你可以添加一个普通的where
条款,例如where t1.date > subdate(current_date(), 7)
来获取最近七天的价格
如果昨天的价格没有一行,我们将day_change
NULL
答案 2 :(得分:1)
@波西米亚的回答是正确的,将返回前一天的价格差异,但实际上我怀疑你实际上会想要自前一天交易以来的价格差异(可能跨越周末,公众假期)等等。)。
要做到这一点,必须首先使用子查询来确定每家公司交易的最后一天(个别公司可能会被暂停,或者可能在不同的市场中进行交易,但会有不同的假期);然后使用(date,company)
对查找最后一个价格......
SELECT current.*, current.Price - previous.Price AS Day_Change
FROM (
SELECT yourtable.*, MAX(before.Date) AS prevDate
FROM
yourtable
JOIN yourtable AS before
ON before.Date < yourtable.Date
AND before.Company = yourtable.Company
GROUP BY yourtable.Date, yourtable.Company
) AS current
JOIN yourtable AS previous
ON previous.Date = current.prevDate
AND previous.Company= current.Company