SQL KEEP 窗口函数等价改写案例

一哥们出条sql题给我玩,将下面sql改成不使用keep分析函数的写法。
select deptno,
ename,
sal,
hiredate,
min(sal) keep(dense_rank first order by hiredate) over(partition by deptno) min_sal,
max(sal) keep(dense_rank last order by hiredate) over(partition by deptno) max_sal
from emp;
我一开始改错了,被这哥们喷菜鸡,我草。
-- 错误等价改写,逻辑不等价
with x as (
select e1.deptno,
e1.ename,
e1.sal,
e1.hiredate,
row_number() over (partition by DEPTNO order by HIREDATE) rn_first,
row_number() over (partition by DEPTNO order by HIREDATE DESC) rn_last
from EMP e1)
select
e.deptno,
e.ename,
e.sal,
e.hiredate,
x1.SAL,
x2.SAL
from emp e
inner join x x1 on e.DEPTNO = x1.DEPTNO and x1.rn_first = 1
inner join x x2 on e.DEPTNO = x2.DEPTNO and x2.rn_last = 1;
我换了张表测试下,发现上面改写是逻辑有问题,如果同一个组内有相同日期的,分组字段内有NULL值的,确实会导致SQL结果集不一致。
-- 将EMP表替换成EMPLOYEES,如果使用上面等价改写就错误了。
select DEPARTMENT_ID,
FIRST_NAME,
SALARY,
HIRE_DATE,
min(SALARY) keep(dense_rank first order by HIRE_DATE) over(partition by DEPARTMENT_ID) min_sal,
max(SALARY) keep(dense_rank last order by HIRE_DATE) over(partition by DEPARTMENT_ID) max_sal
from EMPLOYEES;
最终等价改写的SQL,增加了分组字段内有NULL值的逻辑,和处理一个组内有相同日期的逻辑。
select e.DEPARTMENT_ID,
e.FIRST_NAME,
e.SALARY,
e.HIRE_DATE,
(select MIN_SALARY
from (select DEPARTMENT_ID, MIN(SALARY) MIN_SALARY
from (select DEPARTMENT_ID,
SALARY,
HIRE_DATE,
dense_rank() over (PARTITION BY DEPARTMENT_ID ORDER BY HIRE_DATE) RN
from EMPLOYEES)
WHERE RN = 1
GROUP BY DEPARTMENT_ID) e1
where case when e1.DEPARTMENT_ID is null then 99999 else e1.DEPARTMENT_ID end = case when e.DEPARTMENT_ID is null then 99999 else e.DEPARTMENT_ID end) a_min,
(select MAX_SALARY
from (select DEPARTMENT_ID, MAX(SALARY) MAX_SALARY
from (select DEPARTMENT_ID,
SALARY,
HIRE_DATE,
dense_rank() over (PARTITION BY DEPARTMENT_ID ORDER BY HIRE_DATE DESC) RN
from EMPLOYEES)
WHERE RN = 1
GROUP BY DEPARTMENT_ID) e1
where case when e1.DEPARTMENT_ID is null then 99999 else e1.DEPARTMENT_ID end = case when e.DEPARTMENT_ID is null then 99999 else e.DEPARTMENT_ID end ) a_max
FROM EMPLOYEES e;
差集比较后是等价的:

SQL KEEP 窗口函数等价改写案例的更多相关文章
- 小米正式开源 SQL 智能优化与改写工具 SOAR
近日,小米正式宣布开源 SOAR. 截至今日,该项目已经获得了 350 个「star」以及 44 个「fork」(GitHub项目地址:https://github.com/XiaoMi/soar) ...
- Hive Sql的窗口函数
date: 2019-08-30 11:02:37 updated: 2019-08-30 14:40:00 Hive Sql的窗口函数 1. count.sum.avg.max.min 以 sum ...
- SOAR SQL进行优化和改写的自动化工具
前言 SQL优化是程序开发中经常遇到的问题,尤其是在程序规模不断扩大的时候.SQL的好坏不仅制约着程序的规模,影响着用户的体验,甚至威胁着信息的安全. 我们经常听到说哪家平台挂了,哪家网站被黑了,但我 ...
- 总结SQL Server窗口函数的简单使用
总结SQL Server窗口函数的简单使用 前言:我一直十分喜欢使用SQL Server2005/2008的窗口函数,排名函数ROW_NUMBER()尤甚.今天晚上我在查看SQL Server开发的相 ...
- (4.34)sql server窗口函数
关键词:sql server窗口函数,窗口函数,分析函数 如果分析函数不可用,那么可能是版本还不支持 Window Function 包含了 4 个大类.分别是: 1 - Rank Function ...
- SQL Server标量函数改写内联表值函数优化案例
问题SQL: SELECT TOP 1001 ha.HuntApplicationID , ha.PartyNumber , mht.Name AS MasterHuntTypeName , htly ...
- SQL Server 2012安装错误案例:Error while enabling Windows feature: NetFx3, Error Code: -2146498298
案例环境: 服务器环境 : Windows Server 2012 R2 Standard 数据库版本 : SQL Server 2012 SP1 案例介绍: 在Windows Ser ...
- 虚拟机备份克隆导致SQL SERVER 出现IO错误案例
案例环境: 服务器配置: CPU: Intel E5-2690 RAM: 12G 虚拟机 操作系统 : Windows Server 2008 R2 Standard Edtion ...
- SQL Server一致性错误修复案例总结
今天遇到了一个关于数据库一致性错误的案例.海外工厂的一台SQL Server 2005(9.00.5069.00 Standard Edition)数据库在做DBCC CHECKDB的时候出现了一致性 ...
- SQL Server 窗口函数详解:OVER()
语法 开窗函数支持分区.排序和框架三种元素,其语法格式如下: OVER ( [ <PARTITION BY clause> ] [ <ORDER BY clause> ] [ ...
随机推荐
- 重新点亮shell————awk 控制语句[十三]
前言 简单介绍一下控制语句. 正文 例子1: 例子2: 例子3 for循环: 例子4, sum会复用: 同样,其他的while 和 do while 也是可以在awk中使用的. 结 下一节awk数组.
- docker 应用篇————es[八]
前言 简单介绍一下es镜像. 正文 首先安装一下: elasticSearch. 启动一下: 然后就可以访问了. 使用一下docker stats 然后你就发现了这个docker 容器启动的时候要1. ...
- 分布式文件存储-FastDFS
1.1 FastDFS简介 1.1.1 FastDFS体系结构 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了 ...
- 通过一个非常简单的SSM项目来将SpringMVC配置整理清晰。
所有的文件在Git上面都能找到,由于把代码搞上来看的很不舒服,结构不清晰. 第一步:确定环境 IDEA MySQL 5.7.19 Tomcat 9 Maven 3.6 第二步:创建数据库 参考GIT上 ...
- 【笔记】rocketMQ了解
记录rocketMQ 忘了从哪儿保存的图了 原图链接:https://www.jianshu.com/p/2838890f3284
- 力扣219(java&python)-存在重复元素 II(简单)
题目: 给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k .如果存在 ...
- 重磅官宣:Nacos2.0 发布,性能提升 10 倍
简介: 继 Nacos 1.0 发布以来,Nacos 迅速被成千上万家企业采用,并构建起强大的生态.但是随着用户深入使用,逐渐暴露一些性能问题,因此我们启动了 Nacos 2.0 的隔代产品设计,时隔 ...
- 【ESSD技术解读-01】 云原生时代,阿里云 ESSD 快照服务 助力企业级数据保护
简介:本文以云原生为时代背景,介绍了阿里云块存储快照服务如何基于高性能 ESSD 云盘提升快照服务性能,提供轻量.实时的用户体验及揭秘背后的技术原理.依据行业发展及云上数据保护场景,为企业用户及备份 ...
- [MySQL] 导入数据库和表的两种方式
如果是导入 mysqldump 导出的 sql 文件,使用 mysql 命令再导入就可以了. 下面是另一种可选方式: use xxdb source /var/lib/mysql/xxtable.sq ...
- 2019-11-29-WPF-Process.Start-出现-Win32Exception-异常
title author date CreateTime categories WPF Process.Start 出现 Win32Exception 异常 lindexi 2019-11-29 10 ...