看板 Database 關於我們 聯絡資訊
※ 引述《MOONY135 (談無慾)》之銘言: : ※ 引述《Wengboyu ( )》之銘言: : 這東西看起來就是準備最後的報表類 而且資料算是已經都不會再新增的 : 建議作法是 : 直接把a table的每一筆資料都取出來 丟進去算 : 最後塞到c結算table裡面 用排程去慢慢跑 : 不要想著一次就全部撈出來而且每次都直接算新的 : //==== : 剛剛想到更新的做法 : 從TABLE a取出最老的日期 然後把那個日期跟到今天的日期弄成另外一張table : table 欄位大概就是 : day is_done : 20200101 1 : 20200102 0 : . : . : . : 202001005 0 : 然後開始 用那個日期去撈b : count(*) between year_of_day : and day GROUP BY docter_id : 就好了 : 排程5~10秒做一次 一次處理一天 : 三個多小時可以做完一年的份量 非常感謝你的建議,我原先的code跑了2整天還是依然沒有結果(放棄) 排程分次跑,可能比較有機會能夠完成 你提到的這個想法我曾經考慮過 但doctor_id大約有2000筆,時間長度大概有6年 考慮到這樣的運算量,就放棄了這個作法 (不過現在想起來,原先code的寫法不會比這個省) 另一個我曾經考慮過的想法是維持原先的code 只是每算出一筆 就把a.date, a.doctor, doctor_service_volume存到另一個dataset temp 然後在每次運算前,就去找temp是不是已經有算出的結果 如果有就直接讀取,沒有就運算原先的code,然後把結果在存到temp 這樣就可能節省運算量 但我不知道sql能不能做這樣的操作,我也不知道該怎麼寫 可能分排程或你建議的方法,兩者花費的時間會相當接近 讓我花點時間試試看,如果大家有什麼想法也歡迎提出討論 感謝 : : 資料庫名稱:SAS SQL : : b.prescriptiondate between a.prescriptionBeginDate and : : intnx('year', a.PrescriptionBeginDate, -1, 'same')) : : as service_volume : : from : : dataset a, dataset b; : : quit; : : 因為跑很久,我不太確定這樣寫是不是可以得到我要的結果.. : : table a 有240萬筆,b有1600萬筆 : : 如果大家要測試自己code寫得對不對,會怎麼弄? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.174.43.32 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Database/M.1601962411.A.282.html ※ 編輯: Wengboyu (1.174.43.32 臺灣), 10/06/2020 13:36:30
MOONY135: 如果用單一日期再用between 撈不出來 那應該也沒啥辦法 10/06 22:34
MOONY135: 了 10/06 22:34
MOONY135: 你的是兩百四十萬筆去join 這個是一筆一筆去排程做完 10/06 22:35
MOONY135: 十秒撈一次 一次撈五天就好 大概也是兩三天就做完 10/06 22:36
MOONY135: 分批做才是正確的 一次撈db會死給你看 更別說還有其他 10/06 22:38
MOONY135: 存取 10/06 22:38