首页 > 数据库 >SQL改写案例1

SQL改写案例1

时间:2022-11-17 10:24:58浏览次数:37  
标签:-% 01 SQL regist 改写 案例 str time date





一开发哥们找我改写SQL,他写的逻辑始终不对,安排!

-- 他写的SQL:

# order_id 是主键

with a as (
select str_to_date(regist_time,'%Y-%m-%d') as regist_time
from inno_busi_info_all
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 inno_busi_info_all
where handle_dept = '越秀区市场监督管理局'
and get_type = '互联网平台'
),
c as (
select str_to_date(regist_time,'%Y-%m-%d') as regist_time,order_id
from inno_busi_info_all
where handle_dept = '越秀区市场监督管理局'
and get_type = '微信小程序'
)
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 = '越秀区市场监督管理局' and get_type = '互联网平台'  的数量 和 条件为2 handle_dept = '越秀区市场监督管理局' and get_type = '微信小程序'。

平时经常和他交流,有时候他看我优化SQL 经常用到 CTE 表达式,然而现在他也学会了这么玩,但是也分情况来使用。
但是像这种SQL只查询一张表的情况下是不需要用到 CTE 表达式 加 left join , 如果写法不妥当,容易让数据翻倍,本来简单的逻辑就复杂化了。

然后在他原有的SQL上进行等价改写:

with a as (
select str_to_date(regist_time,'%Y-%m-%d') as regist_time
from inno_busi_info_all
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 inno_busi_info_all
where handle_dept = '越秀区市场监督管理局'
and get_type = '互联网平台'
),
c as (
select str_to_date(regist_time,'%Y-%m-%d') as regist_time,order_id
from inno_busi_info_all
where handle_dept = '越秀区市场监督管理局'
and get_type = '微信小程序'
)
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


这样一来,数据都形成了 1 的关系,顺利解决的这个问题。


最后给了他一个我等价改写的版本:

select str_to_date(regist_time, '%Y-%m-%d') as regist_time,
       count((case when handle_dept = '越秀区市场监督管理局' and get_type = '互联网平台' then order_id end)) as pc,
       count((case when handle_dept = '越秀区市场监督管理局' and get_type = '微信小程序' then order_id end)) as wxxch
from inno_busi_info_all
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');



这种才生产代码上是最正确的写法。

标签:-%,01,SQL,regist,改写,案例,str,time,date
From: https://www.cnblogs.com/yuzhijian/p/16898516.html

相关文章

  • Linux内存泄露案例分析和内存管理分享
    作者:李遵举一、问题近期我们运维同事接到线上LB(负载均衡)服务内存报警,运维同事反馈说LB集群有部分机器的内存使用率超过80%,有的甚至超过90%,而且内存使用率还再不停的增长......
  • SQL优化案例2(白云区短信项目)
    京华开发一哥们找我优化条报表SQL,反馈执行时间很慢需要18s才能出结果,安排。#原SQL    SELECT    2ASTYPE,    to_char(a."create_time",'yyy......
  • SQL Server 高可用(always on)配置指南之数据库侦听器及高可用
    1.简介1、参考SQLServer高可用(alwayson)配置指南之域(AD)环境搭建  ​​https://blog.51cto.com/waringid/5851856​​完成域控服务器(DomainControl,以下简称DC)2、......
  • mysql的锁机制-MyISAM表锁
    1、MySQL锁的基本介绍锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资......
  • Babelfish for PostgreSQL
      BabelfishforPostgreSQL开源已快一月,不过全网还没有实践者总结。今天我们就测试看看,Babelfish到底是如何部署与使用的! BabelfishforPostgreSQL介绍我们先回......
  • MySQL8.0.26-Linux版安装
    MySQL8.0.26-Linux版安装1.准备一台Linux服务器云服务器或者虚拟机都可以;Linux的版本为CentOS7;2.下载Linux版MySQL安装包https://downloads.mysql.com/archives/......
  • 大数据Hadoop之——EFAK和Confluent KSQL简单使用(kafka listeners 和 advertised.list
    目录一、EFAK概述和安装二、listeners和advertised.listeners配置详解三、KSQL使用1)KSQL架构2)Confluent安装(ZK/KAFKA/KSQL)1、下载confluent2、配置环境变量3、创建log和dat......
  • MySQL 创建存储过程,使用 while 批量插入数据
    1、创建带字段的表student(id,name,age)#id整型主建不能为空自动增长#name字符型长度50不能为空#age整型不能为空默认值18mysql>createtablestudent(->i......
  • MySQL Binlog 的配置
    binlog简介binlog是一个二进制格式的文件,用于记录用户对数据库增量操作的SQL语句信息,例如更改数据库表和更改内容的SQL语句都会记录到binlog里,但是对库表等内容的查询不会记......
  • MySQL 关闭slave主重
    1、停止从服务 stopslave;2、检查slave_open_temp_tables变量的值 showstatuslike'%slave%';mysql>showstatuslike'%slave%';+------------------------+-------+......