作者Wengboyu ( )
看板Database
標題Re: [SQL ] 滾動計算並回傳
時間Tue Oct 6 13:33:24 2020
※ 引述《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