关于每月累积的sql

我自己写的原sql

select a.xzq,a.bm,a.sj,count(distinct b.SFZ)

from(select distinct b.xzq,b.bm,to_date(to_char(a.sj,'yyyy-mm'),'yyyy-mm')as sj

from a,b

where a.sfz = b.sfz

and a.sj>= to_date('2020-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')

and a.sj < to_date('2020-12-01 00:00:00','yyyy-mm-dd hh24:mi:ss') )a

left join (select b.xzq,b.bm,to_date(to_char(a.sj,'yyyy-mm'),'yyyy-mm')as sj,a.sfz

from a,b

where a.sfz = b.sfz

and a.sj>= to_date('2020-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')

and a.sj < to_date('2020-12-01 00:00:00','yyyy-mm-dd hh24:mi:ss')

)b

on (a.xzq=b.xzq and a.bm = b.bm and a.sj>=b.sj)

group by a.xzq,a.bm,a.sj

运行起来很慢,想请教一下各位大佬,可以改的更简洁一些,更快一些吗,数据库是Oracle

林夕丶 发布于 2020-12-25 16:43 (编辑于 2020-12-25 16:55)
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共2回答
最佳回答
1
LarryAbbyLv5中级互助
发布于2020-12-25 17:09

你这是一年的数据,肯定慢啊,试试这种方式能不能提醒下性能,还不行的话如果系统允许,可以考虑开下并行

WITH A_B AS

 (SELECT B.XZQ,

         B.BM,

         TO_DATE(TO_CHAR(A.SJ, 'yyyy-mm'), 'yyyy-mm') AS SJ,

         A.SFZ

    FROM A, B

   WHERE A.SFZ = B.SFZ

     AND A.SJ >= TO_DATE('2020-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss')

     AND A.SJ < TO_DATE('2020-12-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss'))


SELECT A.XZQ, A.BM, A.SJ, COUNT(DISTINCT B.SFZ)

  FROM (SELECT DISTINCT B.XZQ,

                        B.BM,

                        TO_DATE(TO_CHAR(A.SJ, 'yyyy-mm'), 'yyyy-mm') AS SJ

          FROM A_B) A


  LEFT JOIN A_B B


    ON (A.XZQ = B.XZQ AND A.BM = B.BM AND A.SJ >= B.SJ)


 GROUP BY A.XZQ, A.BM, A.SJ


  • 林夕丶 林夕丶(提问者) 是的,就是当年的数据,原始数据库里是单条记录,报表要以时间为参数做年初到每月月底的累计数,当月的话就做到每天的累计数,在帆软里面计算太慢了,所以我这边打算做个中间表,在数据库的中间表里做计算,报表直接拿结果,我这边写了个SQL,觉得写的运行的太慢了
    2020-12-25 17:18 
  • LarryAbby LarryAbby 回复 林夕丶(提问者) 你可以按天汇总啊,然后在时间字段上加个索引,效率应该会提升很多的
    2020-12-25 18:06 
最佳回答
0
ScyalcireLv7中级互助
发布于2020-12-25 16:58

单独把这个做成一个视图或者中间表

image.png

  • 林夕丶 林夕丶(提问者) 这是之前的时间的,做的月度时点数据,我后面还要做当天的时点数的,到时候设置自动更新,也做中间表吗?
    2020-12-25 17:13 
  • 3关注人数
  • 407浏览人数
  • 最后回答于:2020-12-25 17:09
    请选择关闭问题的原因
    确定 取消
    返回顶部