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 ...
随机推荐
- Beta冲刺——用户使用调查报告
项目Beta冲刺(团队) --用户使用调查报告 一.项目概述 1.1项目名称 卡战三国 1.2项目简介 一款休闲娱乐益智卡牌游戏 1.3 项目预期目标 开发一款基于三国题材的卡牌通关对战手机游戏 二. ...
- CSS IE Hack
条件注释判断浏览器!: [if !IE],The NOT operator. This is placed immediately in front of the feature, operator, ...
- Day01~15 - Python语言基础
Day01 - 初识Python Python简介 - Python的历史 / Python的优缺点 / Python的应用领域 搭建编程环境 - Windows环境 / Linux环境 / MacO ...
- Linux中的CentOS 7克隆之后修改
1.VMware Workstation软件查看克隆完成后的虚拟机网卡mac地址,记录下来 2.输入[cd /etc/sysconfig/network-scripts/]命令后,再执行[ip add ...
- Redux的图文模型
Also these are really nice (from http://slides.com/jenyaterpil/redux-from-twitter-hype-to-production ...
- GridControl 使用方法篇 --- 隐藏表头、隐藏Group by Box
- make命令与Makefile(转载)
概述博客内容包含linux下make命令的使用与makefile的书写规则等,希望通过本文档使读者对make命令makefile文件有进一步了解,由于鄙人经验学识有限文档中会有描述不准确以及理解偏差, ...
- ent 基本使用十九 事务处理
ent 生成的代码中client 提供了比较全的事务处理 启动单个事务进行处理 // GenTx generates group of entities in a transaction. func ...
- canal简单安装使用
canal简介:https://github.com/alibaba/canal 1.数据库配置 首先使用canal需要修改数据库配置 [mysqld] log-bin=mysql-bin # 开启 ...
- 几种npm install 的区别
一个node package有两种依赖,一种是dependencies,一种是devDependencies,其中前者依赖的项该是正常运行该包时所需要的依赖项,而后者则是开发的时候需要的依赖项,像一些 ...