日前嘗試做一個股票系統,有一個功能是要從資料庫中抓出5天的每日成交量,我的資料是直接抓每日的所有股票,所以每一個table就是一天,於是我就打出了5次的連續inner join,想請問各路大神,有沒有更好的方法可以做出這個表
以下附上我寫的程式碼
SELECT stock_20200807.證券代號 AS STOCK_ID,
stock_20200807.成交股數 AS CAPACITY_1, stock_20200806.成交股數 AS CAPACITY_2,
stock_20200805.成交股數 AS CAPACITY_3, stock_20200804.成交股數 AS CAPACITY_4,
stock_20200803.成交股數 AS CAPACITY_5, stock_20200731.成交股數 AS CAPACITY_6
FROM (((((stock_20200807
INNER JOIN stock_20200806 on stock_20200807.證券代號 = stock_20200806.證券代號)
INNER JOIN stock_20200805 on stock_20200807.證券代號 = stock_20200805.證券代號)
INNER JOIN stock_20200804 on stock_20200807.證券代號 = stock_20200804.證券代號)
INNER JOIN stock_20200803 on stock_20200807.證券代號 = stock_20200803.證券代號)
INNER JOIN stock_20200731 on stock_20200807.證券代號 = stock_20200731.證券代號)
表格可以考慮有這些欄位:
日期, 證券代號, 成交股數
然後將所有日期的股票資料匯入到這個table
之後就隨你下SQL
用日期跟證券代號做主鍵嗎
你可以用日期或證券代號作主鍵(主鍵只能有一個),其他可以建索引,看你是以日期為主去計算證券代號的成交股數,還是以證券代號為主去計算日期區間的成交股數。
索引可以是 日期+證券代號 與 證券代號+日期
另外百萬筆資料計算都是短暫的
你都可以試試看
祝 順利!
再多問一個問題,我的table一共有,證券代號、成交股數、成交筆數、成交金額、開盤價、最高價、最低價、收盤價、漲跌......,如果這些欄位互相都沒有相依,符合正規化3NF的話,我不用再將它們拆開成不同的table了對嗎,還是分割成幾個相同類的table會好一些?
例如,成交金額、筆數之類的放一個table,最高價收盤價之類的放一個table
謝謝!
我的建是議不要為了正規化而正規化。
而且正規化也有它的時空背景,因為以前的硬碟非常貴,所以要怎麼樣節省儲存空間是一大學問。
當科技進步,儲存空間變得便宜,且BI及程式需要,是否一定要正規化,或是部分正規化,就必須考量你想要做什麼? 不是一定要正規化。
這麼說好了,你的table,證券代號應該是主key,而且每天的交易資訊都會有資料,所以這個table根本不需要再做正規化,否則你刻意正規化後,每個table都會有證券代號及交易日期,這樣子才能串聯你現在這些資訊。
要正規化是因為有些資訊不一定有,而你這些每天要交易的股票總不能每周才交易一天吧? 所以才說要清楚什麼要正規化。
這個應該算是主檔,如果你還有一個檔案是交易明細檔,然後交易明細檔裡面有交易人的姓名,這時候產生的交易人資料檔,才是被正規畫出來的table。
希望你可看的懂。
祝 智慧開展!
非常感謝!
所以每一個table就是一天 ??????
Google 一下 "sql 正規化"吧
可先參閱資料庫正規化