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