Mysql 复杂分组后,如何计算上一行/天的百分比增长?
我有一张1分钟的盘中价格表,我在表中存储1分钟的股票开盘价、高价、低价和收盘价: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
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)