Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 复杂分组后,如何计算上一行/天的百分比增长?_Mysql_Group By - Fatal编程技术网

Mysql 复杂分组后,如何计算上一行/天的百分比增长?

Mysql 复杂分组后,如何计算上一行/天的百分比增长?,mysql,group-by,Mysql,Group By,我有一张1分钟的盘中价格表,我在表中存储1分钟的股票开盘价、高价、低价和收盘价: CREATE TABLE `IntradayPrices1Minute` ( `ticker` varchar(10) NOT NULL DEFAULT '', `datetime` datetime NOT NULL, `volume` mediumint(11) unsigned NOT NULL, `open` decimal(8,4) unsigned NOT NULL, `high

我有一张1分钟的盘中价格表,我在表中存储1分钟的股票开盘价、高价、低价和收盘价:

  CREATE TABLE `IntradayPrices1Minute` (
  `ticker` varchar(10) NOT NULL DEFAULT '',
  `datetime` datetime NOT NULL,
  `volume` mediumint(11) unsigned NOT NULL,
  `open` decimal(8,4) unsigned NOT NULL,
  `high` decimal(8,4) unsigned NOT NULL,
  `low` decimal(8,4) unsigned NOT NULL,
  `close` decimal(8,4) unsigned NOT NULL,
  PRIMARY KEY (`datetime`,`ticker`),
  UNIQUE KEY `indxTickerDatetime` (`ticker`,`datetime`) USING BTREE
)
我已经成功地建立了一个查询,在那里我可以计算这些股票的每日开盘价、高价、低价和收盘价。以下是查询:

SELECT 
    ticker,
    DATE(datetime) AS 'Date',
    SUBSTRING_INDEX( GROUP_CONCAT(CAST(open AS CHAR) ORDER BY datetime), ',', 1 ) as 'Daily Open',
    max(GREATEST(open, high, low, close)) AS 'Daily High',
    min(LEAST(open, high, low, close)) AS 'Daily Low',
    SUBSTRING_INDEX( GROUP_CONCAT(CAST(close AS CHAR) ORDER BY datetime DESC), ',', 1 ) as 'Daily Close'

FROM 
    IntradayPrices1Minute

GROUP BY
    ticker, date(datetime)
这是此查询成功返回的部分结果:

ticker  Date        Open    High    Low     Close
----    ----------  ------  ------  ------  ------ 
AAAE    2012-11-26  0.0100  0.0100  0.0100  0.0100
AAAE    2012-11-27  0.0130  0.0140  0.0083  0.0140
AAAE    2012-11-28  0.0140  0.0175  0.0140  0.0165
AAAE    2012-11-29  0.0175  0.0175  0.0137  0.0137
AAMRQ   2012-11-26  0.4411  0.5300  0.4411  0.5290
AAMRQ   2012-11-27  0.5100  0.5110  0.4610  0.4950
AAMRQ   2012-11-28  0.4820  0.4900  0.4300  0.4640
AAMRQ   2012-11-29  0.4505  0.4590  0.4411  0.4590
AAMRQ   2012-11-30  0.4500  0.4570  0.4455  0.4568
现在的问题是:我想返回查询中的第七列,它计算每天收盘价和前一天收盘价之间的增减百分比

我曾经看到过类似的问题,询问StackOverflow,但是在日常价格已经在表格中的情况下。我认为这在我的例子中特别复杂,因为每天的价格是在查询时经过多次分组计算得到的

在此方面的任何帮助都将不胜感激。 非常感谢。
博加

请查看此参考资料:

因此,您当前的OHLC表用于推导px_变化,px_pct:) 结果已
四舍五入
以显示4个小数点的变化以及百分比。 Null用于表示无价格变化/pct,因为Null更好地表示无价格变化 而不是零价格变动;)

查询:

select ticker, date_format(date,'%m-%d-%Y') as date, open, high,low,close,
pxchange,concat(round(pxpct*100,4),'%') pxpct
from (select case when ticker <> @pxticker 
        then @pxclose := null end, p.*, (close-@pxclose) as pxchange,
    (close-@pxclose)/@pxclose as pxpct, (@pxclose := close),
    (@pxticker := ticker) from pricing p
cross join
    (select @pxclose := null, @pxticker := ticker
     from pricing 
     order by ticker, date limit 1)  as a
  order by ticker, date ) as b
order by ticker, date asc
**根据OP在评论**中的要求,更新了显示括号的图片


高值
应已包含最大值,而
低值
应已包含最小值

首先,我重写了select并将其创建为一个视图

create view daily_prices as
SELECT 
    ticker,
    DATE(datetime) AS 'Date',
    SUBSTRING_INDEX( GROUP_CONCAT(CAST(open AS CHAR) ORDER BY datetime), ',', 1 ) as 'Daily Open',
    max(high) AS 'Daily High',
    min(low) AS 'Daily Low',
    SUBSTRING_INDEX( GROUP_CONCAT(CAST(close AS CHAR) ORDER BY datetime DESC), ',', 1 ) as 'Daily Close'
FROM 
    IntradayPrices1Minute
GROUP BY
    ticker, date(datetime)
然后你可以做一个自我连接

select d1.*, d1.`daily close` / d2.`daily close` - 1 as `percent change`
from daily_prices d1
join daily_prices d2 on d1.ticker = d2.ticker and d1.`date` = adddate(d2.`date`, 1)

表中的
打开
关闭
列的含义是什么?例如,为什么一天中间的条目会有一个
close
值?一天中的每个条目的
open
值是否相同?
值是否会在一天中移动?你为什么不在那一刻用一个
price
栏来描述呢?或者是
bid
ask
列?实际上,
成交量
持有什么:自上次创纪录以来的交易量?我想你应该多花点时间考虑一下你的模式。嗨,艾格瓦尔,谢谢你的回答。IntraDayPrices1分钟存储1分钟时间范围内的价格变化。因此,对于每只股票,我每分钟都有一行,其中至少有一笔交易。那一分钟开始时股票的价格是
开盘价。该分钟结束时的价格是
收盘价
价格。
交易量
列是该分钟内交易的股票数量,等等。。。根据1分钟的价格变化,我创建了查询,以获得1天时间内的
打开
、和
关闭
。希望您现在更好地理解我的问题。谢谢。谢谢您的回答。但是,您的查询被设计为直接应用于已保存OHLC价格的表,但请记住,我需要根据查询结果计算每日价格变化百分比。原因是我在表中有1分钟的OHLC价格,而我在查询中计算的是每日OHLC价格。也许我对存储在
IntradayPrices1Minute
表中的数据类型解释得不够清楚。请查看我在评论顶部留给用户eggyal的评论。干杯并感谢:-)你也可以投票支持奥拉夫,因为他帮了你很大的忙:)附加是非常简单的,你在问题的全文下面加一个标题,然后加上你的最终答案。对不起,我现在找不到你的例子。很抱歉回复得太晚了。我把问题分解到这里,让你理解。这里主要有两件事,1。即使日期不是连续的,此查询也适用于股票代码。当发现新的股票代码时,它会将前一天的价格重置为null,以确保没有计算px_chg。你能更新你的问题并给我指一下你所说的右括号吗。顺便问一下,API进展如何?;)您正在从BBG下载数据?只要您的输入数据得到相应处理,您所说的是正确的:),因为查询无法了解您所在国家/地区/企业的假日日历。因此,当您提供定价数据时,必须相应地遵守。查询的作用是提取今天/前一天的数据。星期五是假日,交易所关门了。所以没有价格。在这种情况下,你周五没有争吵,但最后一个交易日:周四。在这种情况下,查询将在周四进行。如果您指的是使查询变得足够智能,可以使用pic calendar holidays-->进行查询,那么这是一个新话题。可以肯定的是,您可以使用具有不同日期的样本数据进行测试。并查看查询结果是否如预期的那样出现:)这是确认的唯一方法。特别是涉及金钱时;)谢谢你,奥拉夫。我痴迷于只在一个查询中完成它。我不是很有经验,也不熟悉各种观点。这样做是否会影响存储或spedd?非常感谢。另外,在尝试了你的方法之后,我得到了以下部分结果:`AAAE 2012-11-27 0.0130 0.0140 0 0.0083 0.0140 0 0.39999999999AAAE 2012-11-28 0.0140 0 0.0175 0.0140 0.0165 0.1785714285714286 AAAE 2012-11-29 0.0175 0.0175 0.0137-0.16969696968我对我评论中的混乱感到非常抱歉。我今天刚从Stackoverflow开始,所以一切对我来说都是新的。Olaf:我正在尝试测试您建议的方法,但是我看到您在组的第一行中有百分比变化(即:2012年11月27日股票AAAE为0.4)。但这是错误的,因为这是我有数据的第一天,所以没有前一天,所以有首
select d1.*, d1.`daily close` / d2.`daily close` - 1 as `percent change`
from daily_prices d1
join daily_prices d2 on d1.ticker = d2.ticker and d1.`date` = adddate(d2.`date`, 1)