oracle 高级用法, DECODE 排序, OVER(PARTITION BY X ORDER BY Y DESC) 开窗函数
场景 01 (IN 语句 排序 decode() 函数):
1,我们在查询中会经常使用这样的用法, select * from table_name t where t.id in (1, 3, 7, 9),这是一条查询表中 id 为 1, 3, 7, 9 的数据现在我们加上一个需求,
要求查出来的数据的顺序和 括号内 id 的 顺序一致,有人会说直接 order by t.id 啊,多简单,那假设顺序是乱的呢?又假如 id 不是数字,而是字符串呢?
如 select * from table_name t where t.id in (1, 13, 7, 9) 或者 select * from table_name t where t.id in (‘hjkhjk’, 'sfhjsf', 'sdasda', 'dasdad')
2,这时候排序就会很麻烦,oracle 数据库为我们提供了一个强大的函数 decode,具体用法如下:
select * from table_name t where t.id in (1, 3, 7, 9) order by decode (t.id, 1, 1, 3, 2, 7, 3, 9, 4)
其中 decode 函数的结果作为 order by 的内容,括号内的参数为 (排序字段,值,顺序,值,顺序……),其中,顺序值越小,排序越靠前
场景 02 (分组排序查询,开窗函数 OVER (PARTITION BY COL1 ORDER BY COL2) ):
1,平时做项目的时候,我们会经常遇到这种情况,假设一张表,每一天都会给表中的每一个种类添加一条数据,现在我们要求根据某个日期查询出所有种类的对应数据,
这很简单,如 select * from table_name t where t.date = '20190101'
2,接下来我们增加难度,要求如果该种类当前查询的日期不存在数据,那么取 最近的前一个有数据的日期 下的对应数据,通俗点说就是 我们要查 20190101 这个日期
下各种类的数据,但是 A 种类 该日期没数据,那么就把日期提前,比如 20181231,如果还没有,就查 20191230,直到找到有数据的日期为止
3,这时候有人会说,我们可以先查出每个种类下 小于等于查询日期 有数据的最大日期,在查询数据,这种方式可行,但是如果表中有几千几万个种类,这回对性能造成
很大的压力
4,这时我们会想到 我们要是能把数据 根据种类分组,然后按 时间倒序 取每个分组的第一条,不就 OK 了吗? 这是我们就要用到 oracle 为我们提供的强大分析函数,也
叫开窗函数 OVER(PARTITION BY X ORDER BY Y DESC) 该函数一般好结合 ROW_NUMBER() 这个获取序号的函数一起结合起来,作为 select 的 查询字段使用,
如:select row_number() over(partition by x order by y desc) rn …… (这种方式获取的 rn 就是排序之后的序号)
5,其中 PARTITION BY X 是根据 X 字段分组,ORDER BY Y DESC 根据 Y 排序, ROW_NUMBER() 在分组排序完成之后,为每个分组中的数据逐条添加序号,每个分
组之间互不干扰,都是从 1 开始往后排,这是后我们直接取行号为 1 的数据,就完美的完成了 2 提出的需求具体如下,一个简单的例子

6,更多关于开窗函数的用法请参考 这个
oracle 高级用法, DECODE 排序, OVER(PARTITION BY X ORDER BY Y DESC) 开窗函数的更多相关文章
- row_number() over(partition by a order by b desc) rn 用法
转载于:http://www.blogjava.net/kxbin/articles/360195.html 可以看看http://jingyan.baidu.com/article/9989c746 ...
- rank() | dense_rank() | row_number() over(PARTITION BY sex order by age desc ) 的区别
1.row_num() over()函数:根据某个字段排序后编号1,2,3.. select *,ROW_NUMBER() over ( order by majorid) as numfrom St ...
- ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN DESC)函数的使用
ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN DESC)函数的作用是指定COLUMN(列)进行分区,在分区内指定COLUMN(列)进行排序 ...
- ROW_NUMBER() OVER (PARTITION BY M ORDER BY N DESC 好用
做查询的时候,发现一个问题,连接之后,有一个表里面有重复的数据.导致另一个表的记录,跟着重复了几遍.用户曾经反馈,评论会多出来几条, 一直没找到原因.只到发现这个问题.才发现了原因.因为一直用sql ...
- python 循环高级用法 [expression for x in X [if condition] for y in Y [if condition] ... for n in N [if condition] ]按照从左至右的顺序,分别是外层循环到内层循环
高级语法 除了像上面介绍的 [x ** 2 for x in L] 这种基本语法之外,列表推导式还有一些高级的扩展. 4.1. 带有if语句 我们可以在 for 语句后面跟上一个 if 判断语句,用于 ...
- row_number() over (partition by....order by...)用法 分组排序
row_number() over (partition by....order by...)用法 分组排序 row_number() OVER (PARTITION BY COL1 ORDER BY ...
- Oracle 高级排序函数 和 高级分组函数
高级排序函数: [ ROW_NUMBER()| RANK() | DENSE_RANK ] OVER (partition by xx order by xx) 1.row_number() 连续且递 ...
- Oracle高级函数
http://www.cnblogs.com/chen1388/archive/2010/07/06/1771919.html decode函数: decode(aa, 1, 'xs', 2, 'ps ...
- ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)用法,先分组,然后在组内排名,分组计算,主表与附表一对多取唯一等
ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)用法 今天在使用多字段去重时,由于某些字段有多种可能性,只需根据部分字段进行去重,在网上看到了row ...
随机推荐
- vue全家桶面试
vue:主要Vue vue-router:关于路由方面的配置 vuex:数据共享和缓存用 vue-resource:于后台交互用(现在改为axios 但是axios不是Vue里面的东西) ...
- Ofbiz项目学习——阶段性小结——插入数据
一.通用插入操作 /** * * 编写一个服务createUomOneDemo, * 该服务的作用是在表Uom中增加一条记录,其中: * 字段uomId的值为“BaseLineProduct”. * ...
- [译] 在 UNIX 中,一切皆文件
原文地址:In UNIX Everything is a File 原文作者:ph7spot.com 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者:pmw ...
- react native开源库管理
安装: 1,正确的安装方式是 npm install xxx --save,经常看到许多组件安装文档上后面没有 --save,如果没有建议加上 否则组件信息不会出现在package.json中,导入组 ...
- applyMiddleware 沉思录
let newStore = applyMiddleware(mid1, mid2, mid3, ...)(createStore)(reducer, null); 给({ getState, dis ...
- ES6学习笔记--default,rest
default 意思是默认值.大家可以看下面的例子,调用animal()方法时忘记了传参数,传统的做法就是加上这一句type= type || 'cat' 来指定默认值. function anima ...
- 项目(1-2)ES32获取mpu9250传入数据库
. 报一个错,找不到min函数 #define min(X,Y) ((X) < (Y) ? (X) : (Y)) 手动添加 之后不报错了 .最原始的采集 /******************* ...
- LeetCode 1081. Smallest Subsequence of Distinct Characters
原题链接在这里:https://leetcode.com/problems/smallest-subsequence-of-distinct-characters/ 题目: Return the le ...
- Spark两种内存管理
Spark动态内存管理 Spark 1.6 后改为动态内存管理(如果想启用静态内存管理,方法下面会介绍),启动动态主要体现在 存储内存和执行内存的动态.
- 洛谷P2607题解
想要深入学习树形DP,请点击我的博客. 本题的DP模型同 P1352 没有上司的舞会.本题的难点在于如何把基环树DP转化为普通的树上DP. 考虑断边和换根.先找到其中的一个环,在上面随意取两个点, 断 ...