SQL改写案例1
一开发哥们找我改写SQL,他写的逻辑始终不对,安排!
-- 他写的SQL:
-- order_id 是主键 with a as (
select str_to_date(regist_time,'%Y-%m-%d') as regist_time
from d
where str_to_date(regist_time,'%Y-%m-%d') between '2022-01-01' and '2022-02-01'
group by str_to_date(regist_time,'%Y-%m-%d')
),
b as (
select str_to_date(regist_time,'%Y-%m-%d') as regist_time,order_id
from d
where handle_dept = 'aaaaaa管理局'
and get_type = '互联网xcxsdg'
),
c as (
select str_to_date(regist_time,'%Y-%m-%d') as regist_time,order_id
from d
where handle_dept = 'aaaaaa管理局'
and get_type = 'rkv程序'
)
select a.regist_time,count(b.order_id) pc,count(c.order_id) wxxch
from a
left join b on a.regist_time = b.regist_time
left join c on a.regist_time = c.regist_time
group by a.regist_time
order by a.regist_time asc
这条SQL的逻辑是要在 '2022-01-01' and '2022-02-01' 的数据中求出条件为1:handle_dept = 'aaaaaa管理局' and get_type = '互联网xcxsdg'和
条件为2:handle_dept = 'aaaaaa管理局' and get_type = 'rkv程序'。
平时经常和他交流,有时候他看我优化SQL 经常用到 CTE 表达式,然而现在他也学会了这么玩,但是也分情况来使用。
但是像这种SQL只查询一张表的情况下是不需要用到 CTE 表达式 加 left join , 如果写法不妥当,容易让数据翻倍,本来简单的逻辑就复杂化了。
-- 然后在他原有的SQL上进行等价改写: WITH a AS (SELECT str_to_date(regist_time, '%Y-%m-%d') AS regist_time
FROM d
WHERE str_to_date(regist_time, '%Y-%m-%d') BETWEEN '2022-01-01' AND '2022-02-01'
GROUP BY str_to_date(regist_time, '%Y-%m-%d')),
b AS (SELECT str_to_date(regist_time, '%Y-%m-%d') AS regist_time, order_id
FROM d
WHERE handle_dept = 'aaaaaa管理局'
AND get_type = '互联网xcxsdg'),
c AS (SELECT str_to_date(regist_time, '%Y-%m-%d') AS regist_time, order_id
FROM d
WHERE handle_dept = 'aaaaaa管理局'
AND get_type = 'rkv程序')
SELECT a.regist_time, COUNT(DISTINCT b.order_id) pc, COUNT(DISTINCT c.order_id) wxxch
FROM a
LEFT JOIN b ON a.regist_time = b.regist_time
LEFT JOIN c ON a.regist_time = c.regist_time
GROUP BY a.regist_time
ORDER BY a.regist_time ASC;
这样一来,顺利解决的这个问题。
最后给了他一个我等价改写的版本:
select str_to_date(regist_time, '%Y-%m-%d') as regist_time,
count((case when handle_dept = 'aaaaaa管理局' and get_type = '互联网xcxsdg' then order_id end)) as pc,
count((case when handle_dept = 'aaaaaa管理局' and get_type = 'rkv程序' then order_id end)) as wxxch
from d
where str_to_date(regist_time, '%Y-%m-%d') between '2022-01-01' and '2022-02-01'
group by str_to_date(regist_time, '%Y-%m-%d');
这种才生产代码上是最正确的写法。
SQL改写案例1的更多相关文章
- 数栈SQL优化案例:隐式转换
MySQL是当下最流行的关系型数据库之一,互联网高速发展的今天,MySQL数据库在电商.金融等诸多行业的生产系统中被广泛使用. 在实际的开发运维过程中,想必大家也常常会碰到慢SQL的困扰.一条性能不好 ...
- SQL注入(SQL Injection)案例和防御方案
sql注入(SQL Injection):就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. SQL注入攻击的主要危害包括:非法读取.篡 ...
- 十八般武艺玩转GaussDB(DWS)性能调优:SQL改写
摘要:本文将系统介绍在GaussDB(DWS)系统中影响性能的坏味道SQL及SQL模式,帮助大家能够从原理层面尽快识别这些坏味道SQL,在调优过程中及时发现问题,进行整改. 数据库的应用中,充斥着坏味 ...
- SQL优化案例—— RowNumber分页
将业务语句翻译成SQL语句不仅是一门技术,还是一门艺术. 下面拿我们程序开发工程师最常用的ROW_NUMBER()分页作为一个典型案例来说明. 先来看看我们最常见的分页的样子: WITH CTE AS ...
- mysql的sql优化案例
前言 mysql的sql优化器比较弱,选择执行计划貌似很随机. 案例 一.表结构说明mysql> show create table table_order\G***************** ...
- SQL 优化案例 1
create or replace procedure SP_GET_NEWEST_CAPTCHA( v_ACCOUNT_ID in VARCHAR2, --接收短信的手机号 v_Tail_num i ...
- sqlserver sql优化案例及思路
始sql: SELECT TOP 100 PERCENT ZZ.CREW_NAME AS 机组, ZZ.CREW_ID, AA.年度时间, CC.当月时间, DD.连续七天时间 AS 最近七天 FRO ...
- Hive SQL综合案例
一 Hive SQL练习之影评案例 案例说明 现有如此三份数据:1.users.dat 数据格式为: 2::M::56::16::70072, 共有6040条数据对应字段为:UserID BigInt ...
- SQL夯实基础(四):子查询及sql优化案例
首先我们先明确一下sql语句的执行顺序,如下有前至后执行: (1)from (2) on (3) join (4) where (5)group by (6) avg,sum... (7 ...
- SQL 优化案例
create or replace procedure SP_GET_NEWEST_CAPTCHA( v_ACCOUNT_ID in VARCHAR2, --接收短信的手机号 v_Tail_num i ...
随机推荐
- java中Object 类
一. Object类简介 Object类是Java.java.lang包下的核心类,Object类是所有类的父类,任何一个类如果没有明确的继承一个父类的话,那么它就是Object的子类: (使用无需导 ...
- ArrayList按指定大小分割集合
ArrayList按指定大小分割集合 项目中使用SpringDataJpa的使用,用到了批量操作,发现框架本身有限制,长度不能超过1000,所以就百度了一下,网上都说是分段处理,也有说用OR的,但数据 ...
- hadoop 启动增加DEBUG信息
export HADOOP_ROOT_LOGGER=DEBUG,console
- java文件共享实现方案
写在前面,由于项目要求负载,又不想大动干戈采用比较贵的设备和高大上的框架,经过一番研究,想使用文件共享方式实现文件的跨服务器访问.本方案采用了jcifs和smbj框架,若想用,请自行查找资源.此为初步 ...
- windows配置supervisor实现nginx自启
前言 有些老项目的nginx部署在windows server上,而且服务器比较老旧,经常异常重启.鉴于个人并不熟悉windows server,因此配置supervisor自启nginx,实现win ...
- 1.0 Python 标准输入与输出
python 是一种高级.面向对象.通用的编程语言,由Guido van Rossum发明,于1991年首次发布.python 的设计哲学强调代码的可读性和简洁性,同时也非常适合于大型项目的开发.py ...
- 将实体类对象数据存入和读取进csv文件(可追加)
前言 最近公司一个新的项目,因为需要存储的数据很少,单独去部署一个数据库去存储该数据显然是不划算的,所以想的是通过存入csv文件中来代替存入数据库中.说干就干. 什么是csv文件 CSV代表逗号分隔值 ...
- [ABC128E] Roadwork
2023-01-14 题目 题目传送门 翻译 翻译 难度&重要性(1~10):4 题目来源 AtCoder 题目算法 区间覆盖,线段树,双堆 解题思路 可以将问题转化为区间覆盖问题和单点查询问 ...
- 【问题解决】容器部署MySQL的数据在docker commit导出的镜像中丢失
问题起因 最近公司有个甲方项目参加竞赛,要求在(基于kubeflow/arena)平台上部置应用,可以将MySQL打包在应用一起,也可以分开部署,没有提供volume相关的支持.大意是可以把初始好的数 ...
- mysql锁初识
MySQL锁的粒度分为:行级锁.表级锁.页级锁. 一.行级锁(INNODB引擎) 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁. 行级锁能大大减少数据库操作的冲突.其加锁粒 ...