一哥们出条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 窗口函数等价改写案例的更多相关文章

  1. 小米正式开源 SQL 智能优化与改写工具 SOAR

    近日,小米正式宣布开源 SOAR. 截至今日,该项目已经获得了 350 个「star」以及 44 个「fork」(GitHub项目地址:https://github.com/XiaoMi/soar) ...

  2. 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 ...

  3. SOAR SQL进行优化和改写的自动化工具

    前言 SQL优化是程序开发中经常遇到的问题,尤其是在程序规模不断扩大的时候.SQL的好坏不仅制约着程序的规模,影响着用户的体验,甚至威胁着信息的安全. 我们经常听到说哪家平台挂了,哪家网站被黑了,但我 ...

  4. 总结SQL Server窗口函数的简单使用

    总结SQL Server窗口函数的简单使用 前言:我一直十分喜欢使用SQL Server2005/2008的窗口函数,排名函数ROW_NUMBER()尤甚.今天晚上我在查看SQL Server开发的相 ...

  5. (4.34)sql server窗口函数

    关键词:sql server窗口函数,窗口函数,分析函数 如果分析函数不可用,那么可能是版本还不支持 Window Function 包含了 4 个大类.分别是: 1 - Rank Function ...

  6. SQL Server标量函数改写内联表值函数优化案例

    问题SQL: SELECT TOP 1001 ha.HuntApplicationID , ha.PartyNumber , mht.Name AS MasterHuntTypeName , htly ...

  7. SQL Server 2012安装错误案例:Error while enabling Windows feature: NetFx3, Error Code: -2146498298

    案例环境: 服务器环境 :    Windows Server 2012 R2 Standard 数据库版本 :    SQL Server 2012 SP1 案例介绍:   在Windows Ser ...

  8. 虚拟机备份克隆导致SQL SERVER 出现IO错误案例

      案例环境:   服务器配置: CPU: Intel E5-2690  RAM: 12G   虚拟机 操作系统  : Windows Server 2008 R2 Standard Edtion   ...

  9. SQL Server一致性错误修复案例总结

    今天遇到了一个关于数据库一致性错误的案例.海外工厂的一台SQL Server 2005(9.00.5069.00 Standard Edition)数据库在做DBCC CHECKDB的时候出现了一致性 ...

  10. SQL Server 窗口函数详解:OVER()

    语法 开窗函数支持分区.排序和框架三种元素,其语法格式如下: OVER ( [ <PARTITION BY clause> ] [ <ORDER BY clause> ] [ ...

随机推荐

  1. Effective Python:简介

    作者:布雷特·斯拉特金 本书的大部分范例代码都遵循Python 3.7版本的语法规范,Python 3.7发布于2018年6月.另外,书里还会给出一些采用Python 3.8语法规范所写的范例,让大家 ...

  2. Vue Mixin 的深入浅出

    mixin, 意为混入. 比如去买冰激凌,我先要一点奶油的,再来点香草的.我就可以吃一个奶油香草的冰激凌.如果再加点草莓,我可以同时吃三个口味的冰激凌. 代码表示 假设把你已有的奶油味的称为 base ...

  3. JVM简明笔记3:类加载机制

    1 类的加载 类的加载指的是将类的 .class 文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class 对象,用来封装类在方法区内的数据结 ...

  4. 力扣326(java)-3的幂(简单)

    题目: 给定一个整数,写一个函数来判断它是否是 3 的幂次方.如果是,返回 true :否则,返回 false . 整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3x 示例 1: 输 ...

  5. 可观测告警运维系统调研——SLS告警与多款方案对比

    简介: 本文介绍对比多款告警监控运维平台方案,覆盖阿里云SLS.Azure.AWS.自建系统(ELK.Prometheus.TICK)等方案. 前言 本篇是SLS新版告警系列宣传与培训的第三篇,后续我 ...

  6. 作业帮基于 DeltaLake 的数据湖建设最佳实践

    ​简介:作业帮是一家以科技为载体的在线教育公司,其大数据中台作为基础系统中台,主要负责建设公司级数仓,向各个产品线提供面向业务主题的数据信息.本文主要分享了作业帮基于 DeltaLake 的数据湖建设 ...

  7. OpenKruise v0.10.0 新特性 WorkloadSpread 解读

    ​简介: 针对需求,OpenKruise 在 v0.10.0 版本中新增了 WorkloadSpread 特性.目前它支持配合 Deployment.ReplicaSet.CloneSet 这些 wo ...

  8. CSS3 transition动画、transform变换、animation动画

    一.CSS3 transition动画 transition可以实现动态效果,实际上是一定时间之内,一组css属性变换到另一组属性的动画展示过程. 属性参数: 1.transition-propert ...

  9. [FE] ServerSideRender 加上 PWA 特性的一种处理方式

    SSR 和 PWA 这两块分开讲,需要做不少的处理,现在我们有了一种简便的方式来处理它,就是使用 Quasar 框架. Quasar 支持了 SPA.SSR.PWA.Mobile APP.Electr ...

  10. WPF 性能测试

    本文收藏我给 WPF 做的性能测试.在你开始认为 WPF 的性能存在问题的时候,不妨来这篇博客里找找看我做过的测试.我记录的测试都是比较纯净的测试项目,没有业务逻辑的干扰,写法也正常,可以更加真实反映 ...