3

我想每天获得价格的变化。什么 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
4

3 回答 3

2

将表连接到自身以获取公司昨天的价格,然后从今天的价格中减去它

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)获取最近 7 天的价格


仅供参考day_changeNULL如果昨天的价格没有一行

于 2012-05-02T23:43:15.030 回答
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

于 2012-05-03T01:19:44.500 回答
1

@Bohemian 的回答是正确的,将返回自前一天以来的价格差异,但实际上我怀疑您实际上会想要自前一天交易以来的价格差异(可能跨越周末、公共假期等)。

要做到这一点,必须首先使用子查询来确定每家公司交易的最后一天(个别公司可以暂停交易,或者可能在不同的市场交易受不同的假期);然后使用该(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
于 2012-05-03T00:06:10.117 回答