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 ...
随机推荐
- KVM 虚拟机 热插拔硬盘
新建硬盘 lvm 命令 lvcreate -L 200G -n lv02 ssd01 qemu-img 命令 qemu-img create -f raw test1G.raw 1G dd 命令 dd ...
- 2021-6-16 TcpIp
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- JS语言里常见的随机函数示例,实验结果分布规律分析
在JavaScript语言里有个 Math.random() 随机函数,用于生成指定范围内的随机数. Math.random()函数 根据官方的定义: Math.random() 函数返回一个浮点数, ...
- Dirty-Pipe Linux内核提权漏洞(CVE-2022-0847)
前言: 划水一波,哈哈,以后复现漏洞不再直接傻瓜无脑的走流程了,首先码字写加构思比较麻烦且写的不多还效率不高,现在就是当做见到了一个漏洞,在此记录一下这个漏洞,包括其来源,简单的描述,适用范围,以及其 ...
- 从零玩转系列之微信支付实战PC端项目构建+页面基础搭建 | 技术创作特训营第一期
一.前言 欢迎来到本期的博客!在这篇文章中,我们将带您深入了解前端开发领域中的一个热门话题: 如何使用 Vue 3 和 Vite 构建前端项目.随着现代 Web 应用程序的需求不断演进, 选择适当的工 ...
- TCP的可靠性之道:确认重传和流量控制
TCP 全称为 Transmission Control Protocol(传输控制协议),是一种面向连接的.可靠的.基于字节流的传输层通信协议,其中可靠性是相对于其他传输协议的优势点.TCP 为了确 ...
- java与es8实战之三:Java API Client有关的知识点串讲
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<java与es8实战>系 ...
- 杰哥教你面试之一百问系列:java中高级多线程concurrent的使用
目录 问题1:什么是ConcurrentHashMap?它与HashMap的区别是什么? 问题2:什么是CopyOnWriteArrayList?它适用于什么样的场景? 问题3:什么是Blocking ...
- Avalonia开发(一)环境搭建
一.介绍 开源 GitHub:https://github.com/AvaloniaUI/Avalonia/ 多平台支持,包括Windows.mac OS.Linux.iOS.Android.Sams ...
- ionic app调试问题
以下是一些ionic app在模拟器中的调试问题: 1. CORS问题 官方原文以及解释:Handling CORS issues in Ionic 国内翻译:彻底解决Ionic项目中的跨域问题 2. ...