【问题标题】:mysql select query for candle stick market datamysql select查询烛台市场数据
【发布时间】:2018-03-31 03:31:51
【问题描述】:

我正在尝试从 mysql 表中选择代表交易价格和市场量的蜡烛数据摘要。

该表包含 1 分钟蜡烛数据的数据。我想得到一个 5 分钟的摘要(基本上将其解释为 5 分钟的蜡烛)。

表格如下所示:

+--------+------+------+------+-------+--------+-------+
| market | open | high | low  | close | volume | time  |
+--------+------+------+------+-------+--------+-------+
| ABC    | 13.6 | 15.4 | 11.2 | 14.1  | 299.4  | 11:59 |
| ABC    | 14.1 | 16.8 | 12.5 | 15.3  | 342.2  | 12:00 |
| ABC    | 15.3 | 16.3 | 11.2 | 14.2  | 351.5  | 12:01 |
| ABC    | 14.2 | 15.5 | 12.3 | 13.2  | 374.2  | 12:02 |
| DEF    | 93.7 | 94.3 | 90.7 | 93.2  | 1123.3 | 11:59 |
| DEF    | 93.2 | 96.5 | 91.1 | 96.3  | 1232.8 | 12:00 |
| DEF    | 96.3 | 98.2 | 95.3 | 95.4  | 1390.4 | 12:01 |
| DEF    | 95.4 | 97.6 | 93.7 | 94.3  | 1360.9 | 12:02 |
+--------+------+------+------+-------+--------+-------+

我需要从该表中进行选择以生成代表更大时间范围的新蜡烛。例如,要表示 5 分钟蜡烛,我需要组合来自 5 个 1 分钟蜡烛的数据。

新蜡烛需要遵循以下规则

  • open 列来自 first(candles[open])
  • high 列来自 max(candles[high])
  • low 列来自 min(candles[low])
  • close 列来自最后一个(candles[close])
  • volume 列来自 sum(candles[volume])

在这个例子中,我刚刚收集了 3 支最新的蜡烛

+--------+------+------+------+-------+--------+-------+
| market | open | high | low  | close | volume | time  |
+--------+------+------+------+-------+--------+-------+
| ABC    | 14.1 | 16.8 | 11.2 | 13.2  | 1067.9 | 12:00 |
| DEF    | 93.2 | 98.2 | 91.1 | 94.3  | 3984.1 | 12:00 |
+--------+------+------+------+-------+--------+-------+

目前为止

SELECT
    market,
    MAX(high) AS 'high', 
    MIN(low) AS 'low', 
    SUM(volume) AS 'volume'
FROM
    candles
WHERE
    time > (UNIX_TIMESTAMP() - 300) 
GROUP BY
    market

忽略打开和关闭列时,这可以正常工作。我无法弄清楚如何在此查询中包含打开和关闭列。我尝试过使用子查询,但没有成功。

【问题讨论】:

    标签: mysql stock-data


    【解决方案1】:
    SELECT T2.MARKET,t1.open,T2.High,T2.low,T2.Volume,T3.close,t1.time
    FROM 
    (SELECT market,open,time FROM candles t1 WHERE TIME IN 
     (SELECT MIN(TIME) FROM Candles WHERE time > (UNIX_TIMESTAMP() - 300) GROUP BY market))
     as T1
    Inner Join
    (
    SELECT
        market,
        MAX(high) AS 'high', 
        MIN(low) AS 'low', 
        SUM(volume) AS 'volume'
    FROM
        candles
      WHERE
        time > (UNIX_TIMESTAMP() - 300)
    GROUP BY
        market
    ) AS t2
    on t1.market=t2.market
    INNER JOIN (SELECT market,Close,Time FROM candles t1 WHERE TIME IN 
     (SELECT MAX(TIME) FROM Candles GROUP BY market)) as t3
     on t2.market=t3.market
    

    在 DEMO 中我删除了where time > (UNIX_TIMESTAMP() - 300)

    http://sqlfiddle.com/#!9/8f090/7

    【讨论】:

    • 除“open”列外,一切正常。这是从第一行检索打开的列,而不是在时间范围内。我将 T1 内部选择更改为包括 WHERE time > (UNIX_TIMESTAMP() - 300)。这似乎工作正常!
    • 如果你得到你的答案,请接受并投票@jamesrogers93
    • 如何使用这个,如果你想从 1 分钟的数据集中得到几个 5 分钟的烛台?例如最后七个 5 分钟烛光?因此,您必须获取 35 个 1 分钟数据集的数据,但汇总为 7 个片段,每个 5 个 1 分钟数据集。如何解决?
    猜你喜欢
    • 1970-01-01
    • 2022-07-23
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 2016-03-12
    相关资源
    最近更新 更多