SQL根据连续日期更改值

时间:2012-05-02 23:40:45

标签: mysql sql date join

我希望每天都能获得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

3 个答案:

答案 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

来源:http://www.sqlfiddle.com/#!2/56de3/3

答案 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