Re: [SQL ] 滾動計算並回傳

作者: Wengboyu ( )   2020-10-06 13:33:24
※ 引述《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寫得對不對,會怎麼弄?
作者: MOONY135 (談無慾)   2020-10-06 22:34:00
如果用單一日期再用between 撈不出來 那應該也沒啥辦法了你的是兩百四十萬筆去join 這個是一筆一筆去排程做完十秒撈一次 一次撈五天就好 大概也是兩三天就做完分批做才是正確的 一次撈db會死給你看 更別說還有其他存取

Links booklink

Contact Us: admin [ a t ] ucptt.com