如何优化这个SQL语句:
这个SQL语句在【ROW_NUMBER() OVER (PARTITION BY 编码 ORDER BY CASE WHEN INSTR(a.新网格, 区域) > 0 then 2 else 1 end DESC,LENGTH(小区关键字) DESC) AS 去重参考】查询的时候变得很慢了;我应该怎么解决这个问题呢;请各位之下招,非常感谢
WITH table_xd AS(
SELECT * FROM install_form_view WHERE 地市 = '梧州' AND 产品 = '宽带' AND 所属WG IS NOT NULL
),
table_a AS (
SELECT a.*,
CASE
WHEN INSTR(a.区县, '山') > 0 THEN ''
WHEN INSTR(a.区县, '藤') > 0 THEN ''
WHEN INSTR(a.区县, '溪') > 0 THEN '溪山'
WHEN INSTR(a.区县, '苍') > 0 OR INSTR(a.区县, '龙') > 0 THEN '苍龙'
WHEN INSTR(a.区县, '长洲') > 0 OR INSTR(a.区县, '万') > 0 THEN '城区'
ELSE '其它'
END AS 区域,
CASE WHEN a.所属WG='网格信息为空' then b.营销网格 else a.所属WG end AS 新网格,
CASE WHEN LENGTH(b.小区)>0 THEN b.小区 ELSE a.小区 end AS 小区关键字
FROM table_xd a
left JOIN (SELECT * FROM wz_basic_info_view GROUP BY 资源标识,小区,CUID,标准地址,营销网格) b ON a.标准地址 LIKE '%' || b.小区 || '%'
),
table_b AS (
SELECT a.*,
ROW_NUMBER() OVER (PARTITION BY 施工单编码 ORDER BY CASE WHEN INSTR(a.新网格, 区域) > 0 then 2 else 1 end DESC,LENGTH(小区关键字) DESC) AS 去重参考,
CASE
WHEN a.新网格 = '新圩网格' THEN 2
WHEN a.新网格 = '陈塘网格' THEN 3
WHEN a.新网格 = '大隆网格' OR a.新网格 = '水汶网格' OR a.新网格 = '文圩网格' THEN 4
WHEN a.新网格 = '大黎网格' OR a.新网格 = '琅南网格' OR a.新网格 = '象棋网格' THEN 5
WHEN a.新网格 = '塘步网格' OR a.新网格 = '糯安网格' OR a.新网格 = '筋诚网格' OR a.新网格 = '岭京网格' THEN 6
WHEN a.新网格 = '金鸡网格' OR a.新网格 = '三塘网格' THEN 7
WHEN a.新网格 ='归义网格' THEN 9
WHEN a.新网格 = '城区富民网格' OR a.新网格 = '城区中山网格' OR a.新网格 = '濛江网格' OR a.新网格 = '南马网格' THEN 10
WHEN a.新网格 = '旺木网格' OR a.新网格 = '县城网格' THEN 11
WHEN a.新网格 = '城区三云网格' OR a.新网格 = '大广新网格' THEN 12
WHEN a.新网格 ='河西网格' THEN 13
WHEN a.新网格 = '太平网格'OR a.新网格 = '新县城网格' THEN 14
WHEN a.新网格 = '城区新兴网格'OR a.新网格 = '城区长洲网格' THEN 15
WHEN a.新网格 = '城区新兴三网格' OR a.新网格 = '城东网格' THEN 17
WHEN a.新网格 ='河东网格' THEN 18
WHEN a.新网格 ='城西网格' THEN 19
WHEN a.新网格 ='县城网格' THEN 22
ELSE 0
END AS 日归档目标值,
CASE
WHEN a.新网格 = '新圩网格' then 70
WHEN a.新网格 = '陈塘网格' then 89
WHEN a.新网格 = '旺木网格' then 126
WHEN a.新网格 = '文圩网格' then 128
WHEN a.新网格 = '大黎网格' then 132
WHEN a.新网格 = '象棋网格' then 159
WHEN a.新网格 = '琅南网格' then 163
WHEN a.新网格 = '筋诚网格' then 168
WHEN a.新网格 = '糯安网格' then 170
WHEN a.新网格 = '大隆网格' OR a.新网格 = '水汶网格' then 174
WHEN a.新网格 = '塘步网格' then 179
WHEN a.新网格 = '三塘网格' then 181
WHEN a.新网格 = '归义网格' then 182
WHEN a.新网格 = '城区中山网格' OR a.新网格 = '金鸡网格' then 199
WHEN a.新网格 = '南马网格' then 202
WHEN a.新网格 = '岭京网格' then 210
WHEN a.新网格 = '城区富民网格' then 230
WHEN a.新网格 = '大广新网格' then 241
WHEN a.新网格 = '濛江网格' then 279
WHEN a.新网格 = '县城网格' then 303
WHEN a.新网格 = '河西网格' then 331
WHEN a.新网格 = '城区长洲网格' then 332
WHEN a.新网格 = '城区新兴网格' then 420
WHEN a.新网格 = '太平网格' then 437
WHEN a.新网格 = '河东网格' then 443
WHEN a.新网格 = '新县城网格' then 471
WHEN a.新网格 = '城区三云网格' then 476
WHEN a.新网格 = '城区新兴三网格' then 550
WHEN a.新网格 = '城东网格' then 568
WHEN a.新网格 = '县城网格' then 584
WHEN a.新网格 = '城西网格' then 616
ELSE 0
END AS 月归档目标值
FROM table_a a
),
table_tj AS(
SELECT 区域,新网格 AS 所属WG,
SUM(CASE
WHEN $[to_char(受理时间, 'YYYY-MM-DD') = '${结束时间}']
AND 工单类型 = '装' AND 产品 = '宽带' AND 校园='否'
-- 匹配业务号
AND 业务号 NOT IN(
SELECT 业务号 FROM table_b WHERE 去重参考 = 1 AND $[to_char(受理时间, 'YYYY-MM-DD') >= '${开始时间}'] AND $[to_char(受理时间, 'YYYY-MM-DD') < '${结束时间}']
)
THEN 1 ELSE 0
END) AS 当日下单,
SUM(CASE
WHEN $[to_char(归档时间, 'YYYY-MM-DD') = '${结束时间}']
AND 工单类型 = '装' AND 产品 = '宽带' AND 校园='否'AND 状态='已归档' THEN 1 ELSE 0
END) AS 当日竣工,
日归档目标值,
SUM(CASE WHEN 产品 = '宽带' AND 工单类型 = '装' AND 状态 NOT IN ('已归档','已撤单','已退单') then 1 else 0 end) AS 在途工单,
SUM(CASE
WHEN $[to_char(受理时间, 'YYYY-MM-DD') >= '${开始时间}'] AND $[to_char(受理时间, 'YYYY-MM-DD') < '${结束时间}']
AND 工单类型 = '装' AND 产品 = '宽带' AND 校园 = '否'
THEN 1 ELSE 0
END) AS 当月下单,
SUM(CASE
WHEN $[to_char(归档时间, 'YYYY-MM-DD') >= '${开始时间}'] AND $[to_char(归档时间, 'YYYY-MM-DD') <= '${结束时间}']
AND 工单类型 = '装' AND 产品 = '宽带' AND 校园='否' AND 状态='已归档' THEN 1 ELSE 0
END) AS 当月竣工,
月归档目标值
FROM table_b WHERE 去重参考 = 1
GROUP BY 区域,新网格,日归档目标值,月归档目标值
)
SELECT 区域,所属WG,当日下单,当日竣工,日归档目标值,
CASE WHEN main."当日竣工" <> 0 THEN ROUND(main."当日竣工"/NULLIF(main."日归档目标值",0),2) else 0 end AS 日完成率,
在途工单,当月下单,当月竣工,月归档目标值,
CASE WHEN main."当月竣工" <> 0 THEN ROUND(main."当月竣工"/NULLIF(main."月归档目标值",0),2) else 0 end AS 月完成率,
CASE WHEN main."当月竣工" <> 0 THEN ROUND(main."当月竣工"/EXTRACT(DAY FROM SYSDATE),0) else 0 end AS 当月日均竣工
FROM table_tj main WHERE LENGTH(所属WG)>0
ORDER BY
CASE 区域
WHEN '城区' THEN 1
WHEN '' THEN 2
WHEN '' THEN 3
WHEN '' THEN 4
WHEN '' THEN 5
ELSE 6
END