在mysql中查询股票/价格趋势

时间:2015-02-26 19:41:42

标签: mysql sql database

SQL Fiddle

表格方案:

CREATE TABLE company
    (`company_id` int,`name` varchar(30))
;

INSERT INTO company
    (`company_id`,`name`)
VALUES
    (1,"Company A"),
    (2,"Company B")

;

CREATE TABLE price
    (`company_id` int,`price` int,`time` timestamp)
;

INSERT INTO price
    (`company_id`,`price`,`time`)
VALUES
    (1,50,'2015-02-21 02:34:40'),
    (2,60,'2015-02-21 02:35:40'),
    (1,70,'2015-02-21 05:34:40'),
    (2,120,'2015-02-21 05:35:40'),
    (1,150,'2015-02-22 02:34:40'),
    (2,130,'2015-02-22 02:35:40'),
    (1,170,'2015-02-22 05:34:40'),
    (2,190,'2015-02-22 05:35:40')

我使用Cron Jobs来获取公司价格。在连接每个公司的价格历史时,我如何确保每天只包括最后一个?在这种情况下,我想要05:30am连接的所有价格记录。

这是我试图获得的结果(我使用日期(时间)仅从时间戳中获取日期):

COMPANY_ID          PRICE            TIME
1                   70|170   2015-02-21|2015-02-22  
2                  120|190   2015-02-21|2015-02-22

我尝试了以下查询,但它不起作用。价格与日期不对应,在应用2:30 am功能之前,我不知道如何排除所有Group_concat条记录。

SELECT company_id,price,trend_date FROM
   ( 
     SELECT  company_id, GROUP_CONCAT(price SEPARATOR'|') AS price,
     GROUP_CONCAT(trend_date SEPARATOR'|') AS trend_date
     FROM 
     (
       SELECT company_id,price,
              DATE(time) AS trend_date 
       FROM price
       ORDER BY time ASC
     )x1
     GROUP BY company_id
   )t1

有人能告诉我如何获得理想的结果吗?

2 个答案:

答案 0 :(得分:1)

好的,所以这应该按预期工作:

SELECT  p.company_id,
        GROUP_CONCAT(price SEPARATOR '|') as price,
        GROUP_CONCAT(PriceDate SEPARATOR '|') as trend_date
FROM price as p
INNER JOIN (SELECT  company_id,
                    DATE(`time`) as PriceDate,
                    MAX(`time`) as MaxTime
            FROM price
            GROUP BY company_id,
                     DATE(`time`)) as t
    ON p.company_id = t.company_id
    AND p.`time` = t.MaxTime
GROUP BY p.company_id

Here is修改后的sqlfiddle。

答案 1 :(得分:1)

这有点不正统,但我认为它解决了你的问题:

 SELECT company_id, 
        GROUP_CONCAT(price SEPARATOR'|'), 
        GROUP_CONCAT(trend_date SEPARATOR'|')            
   FROM (
         SELECT *
            FROM ( 
                   SELECT company_id,
                          DATE(`time`) `trend_date`,
                          price
                     FROM price
                 ORDER BY `time` DESC
                 ) AS a
        GROUP BY company_id, `trend_date` 
        ) AS b
GROUP BY company_id