iT邦幫忙

0

Access 每個日期+證券代號 的前半年最高價的最大值

  • 分享至 

  • xImage

各位大大們好,

想麻煩請教一下如何得到每天每股半年內的最高價之最大值.
資料庫有三個欄位 日期, 證券代號, 最高價.
日期從 2016/1/1 到 2019/12/31.
證券代號是每個股票的代號.
最高價是每個股票那天的最高成交價.
我想用 Query 得出每天每股之前半年的最高價之最大值.
例子: 得出 Query 有三個欄位
2019/12/31, 0050, 最高價最大值 (從 2019/12/30~2019/7/1 0050 這支股票 哪一個價錢是最高價的最大值)
2019/12/30, 0050, 最高價最大值 (從 2019/12/29~2019/6/30 0050 這支股票 哪一個價錢是最高價的最大值)
2019/12/31, 0060, 最高價最大值 (從 2019/12/30~2019/7/1 0060 這支股票 哪一個價錢是最高價的最大值)
2019/12/30, 0060, 最高價最大值 (從 2019/12/29~2019/6/30 0060 這支股票 哪一個價錢是最高價的最大值)
日期也可以用 between 日期-1 AND 日期-135 來計算..

謝謝..

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
paicheng0111
iT邦大師 5 級 ‧ 2020-01-05 16:52:21
最佳解答

初版

select a.ddate, a.sid, b.high2
FROM 
    table a left join (
        select ddate, sid, max(high) as high2 
        from table 
        where ddate between ddate - 1 and ddate - 135 
        group by ddate, sid
        ) b
    on a.ddate = b.ddate and a.sid = b.sid

正確版

SELECT a.ddate, a.sid, MAX(b.high)
FROM
    (SELECT ddate, ddate - 135 AS LB, sid FROM table) a
    LEFT JOIN
    (SELECT ddate, sid, high FROM table) b
    ON b.ddate >= a.LB AND b.ddate < a.ddate AND a.sid = b.sid
GROUP BY a.ddate, a.sid
matureox iT邦新手 5 級 ‧ 2020-01-05 22:12:16 檢舉

謝謝您的解答, 我用你的方法測試了一下, 發現 high2 跑出空白資料.
所以我把 b table 單獨拆出來做 Query 發現跑不出任何資料. 我附上我的 SQL, 結果跟 table 資料. 麻煩您再幫忙看一下. 謝謝.
https://ithelp.ithome.com.tw/upload/images/20200105/20111202DY68ecEWAu.jpg

table 資料我拿兩個證券代碼當例子.
https://www.dropbox.com/s/ayifj3uczj1cjmk/%E5%8D%8A%E5%B9%B4%E6%9C%80%E5%A4%A7%E5%80%BC.xlsx?dl=0

我已修改答案,請再試看看。

0
舜~
iT邦高手 1 級 ‧ 2020-01-05 16:00:12

不考慮效能的話

select 日期, 證券代號,(
    select max(最高價) from 資料表 t1 where 日期 between 日期-1 AND 日期-135 AND t1.證券代號 = 證券代號
) '最高價'
from 資料表
看更多先前的回應...收起先前的回應...

where子句應該要加上證券代號的條件

舜~ iT邦高手 1 級 ‧ 2020-01-05 18:39:08 檢舉

感謝提醒

matureox iT邦新手 5 級 ‧ 2020-01-05 22:15:20 檢舉

謝謝您的回答, 我測試了一下您的 SQL, 最高價跑出空白. 而且您跑的速度比下面大大跑得久. 還是很謝謝您的幫忙.

試試看

select 
    a.日期
    , a.證券代號
    , (select max(最高價) from 資料表 
        where 日期 between a.日期 - 1 AND a.日期 - 135
        AND 證券代號 = a.證券代號
        ) as 最高價
from 資料表 a
matureox iT邦新手 5 級 ‧ 2020-01-06 19:52:30 檢舉

這個也可以跑出正確的 Query 了. 不過比之前那個答案, 速度慢了大概 19 倍.

我要發表回答

立即登入回答