优化一下这段代码,(case when m.order_date <= sysdate then (case when (select mcl.deal_time from mcc_callback_log mcl where mcl.task_id = ct.task_id and (mcl.deal_time between (m.order_date - interval '30' minute) and (m.order_date + interval '30' minute))) is not null then '是' else '否' end) else null end) call_on_time_flag,
时间: 2024-02-10 09:07:50 浏览: 104
可以尝试进行以下优化:
1. 使用 ANSI JOIN 替代子查询:将子查询中的表与主查询的表进行关联。
2. 使用 EXISTS 替代 IS NOT NULL:EXISTS 通常比 IS NOT NULL 更高效。
3. 将时间范围的计算提取到子查询外部,避免重复计算。
优化后的代码如下:
```
SELECT
CASE
WHEN m.order_date <= SYSDATE THEN
CASE
WHEN EXISTS (
SELECT 1
FROM mcc_callback_log mcl
JOIN mcc_callback_task ct ON mcl.task_id = ct.task_id
WHERE mcl.deal_time BETWEEN m.order_date - INTERVAL '30' MINUTE AND m.order_date + INTERVAL '30' MINUTE
) THEN '是'
ELSE '否'
END
ELSE NULL
END AS call_on_time_flag
FROM mcc_order m
```
相关问题
SELECT b.city AS administrativeDivision, isnull(sum(case when a.enterprise_level=0 then 1 else 0 end),0) as excellent, isnull(sum(case when a.enterprise_level=1 then 1 else 0 end),0) as good, isnull(sum(case when a.enterprise_level=2 then 1 else 0 end),0) as average, isnull(sum(case when a.enterprise_level=3 then 1 else 0 end),0) as poor, COUNT(a.ID) AS enterprises_total FROM ALL_SAFE.t_enterprise_effect a,ALL_SAFE.T_ENTERPRISE_INFO b WHERE a.enterprise_code = b.enter_code and a.end_time >= TRUNC(NEXT_DAY(SYSDATE-8,1)-6) AND a.end_time < TRUNC(NEXT_DAY(SYSDATE-8,1)+1) AND (b.city != '') group by b.city
这是另一个SQL查询语句,用于统计企业级别在指定时间范围内的数量,并按城市进行分组。
查询结果包括行政区划(使用b.city字段作为别名)、优秀企业数量、良好企业数量、一般企业数量、差劣企业数量和总企业数量。
查询条件包括企业编码与企业信息表中的企业编码匹配,以及结束时间在指定范围内的条件。还有一个额外的条件是城市不为空。
最后,使用GROUP BY语句按城市进行分组,以获取每个城市的统计结果。
请注意,这个查询语句也使用了动态SQL的写法,并使用了SUM和CASE语句来计算不同企业级别的数量。
lag(v.executive_date, 1, nvl( (select a.fill_date from t_mh_baseinfo a where a.if_del='0' and a.fill_date>=trunc(sysdate-1,'yyyy') and a.field_pk=v.baseinfo_field_pk_fk) , trunc(sysdate-1,'yyyy')) ) over(partition by v.baseinfo_field_pk_fk order by v.executive_date,v.dt_create) last_follow,
这段代码是一个使用了 LAG 函数的窗口函数表达式。让我逐步解释它的含义:
1. 首先,使用了 LAG 函数来获取指定列(v.executive_date)在当前行之前的一行数据。语法为 `LAG(column, offset, default)`,其中 `column` 是要获取的列,`offset` 是指定的偏移量(这里为1,表示前一行),`default` 是当偏移位置不存在时返回的默认值。
2. 如果前一行数据不存在(即 offset 超出了范围),则使用 NVL 函数来确定默认值。NVL 函数用于判断第一个参数是否为 NULL,如果是,则返回第二个参数作为默认值。
3. 在 NVL 函数的第一个参数中,使用了一个子查询来获取满足一些条件的行的 fill_date 值。子查询是从表 t_mh_baseinfo 中选择符合条件的数据,其中包括 if_del='0'、fill_date 大于等于去年年初(trunc(sysdate-1,'yyyy')),以及 field_pk 等于当前行的 baseinfo_field_pk_fk 值。
4. 如果子查询没有返回结果(即满足条件的行不存在),则使用 trunc(sysdate-1,'yyyy') 作为默认值。trunc(sysdate-1,'yyyy') 是将昨天的日期截取到年份的开始,即去年年初。
5. 最后,使用 OVER 子句指定了窗口函数的分区和排序方式。其中,分区按照 baseinfo_field_pk_fk 列进行分组,排序按照 executive_date 和 dt_create 列进行排序。
综上所述,这段代码的作用是在查询结果中添加了一个名为 last_follow 的列,该列包含了在当前行之前的一行数据的 executive_date 值。如果找不到前一行数据,则使用满足条件的 fill_date 值,如果条件也不满足,则使用去年年初的日期作为默认值。
阅读全文