3

私はテーブル IntradayPrices1Minute を持っており、ここに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

問題は次のとおりです。クエリの 7 番目の列を返し、終値と前日の終値の間の増減率を毎日計算します。

StackOverflow で同様の質問が寄せられているのを見たことがありますが、毎日の価格が既に表にある状況についてです。毎日の価格は、いくつかのグループ化計算の後、クエリ時に取得されるため、私の場合は特に複雑だと思います。

これに関する任意の助けをいただければ幸いです。どうもありがとう。ボガ

4

2 に答える 2

3

このリファレンスをご覧ください:SQLFIDDLE

したがって、OHLCを使用した現在のテーブルを使用して、px_change、px_pctを導出します:)結果はrounded、変化の小数点以下4桁とパーセンテージを示しています。 nullは、価格変更がゼロであるよりも価格変更がないことをより適切に表すため、価格変更/pctがないことを示すために使用されます;)

クエリ:

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

結果:

TICKER  DATE        OPEN    HIGH    LOW     CLOSE   PXCHANGE  PXPCT
AAAE    11-26-2012  0.01    0.01    0.01    0.01    (null)    (null)
AAAE    11-27-2012  0.013   0.014   0.0083  0.014   0.004     40.0000%
AAAE    11-28-2012  0.014   0.0175  0.014   0.0165  0.0025    17.8571%
AAAE    11-29-2012  0.0175  0.0175  0.0137  0.0137  -0.0028   -16.9697%
AAMRQ   11-26-2012  0.4411  0.53    0.4411  0.529   (null)    (null)
AAMRQ   11-27-2012  0.51    0.511   0.461   0.495   -0.034    -6.4272%
AAMRQ   11-28-2012  0.482   0.49    0.43    0.464   -0.031    -6.2626%
AAMRQ   11-29-2012  0.4505  0.459   0.4411  0.459   -0.005    -1.0776%
AAMRQ   11-30-2012  0.45    0.457   0.4455  0.4568  -0.0022   -0.4793%

**コメントでOPの要求に従って括弧を表示するために画像で更新されました**:)

ここに画像の説明を入力してください

于 2012-12-02T17:05:59.957 に答える
1

highにはすでに最大low値が含まれている必要があり、最小値が既に含まれている必要があります。

まず、選択を書き直して、ビューとして作成します

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)

SQL フィドル

于 2012-12-02T17:24:52.020 に答える