oracle 高级用法, DECODE 排序, OVER(PARTITION BY X ORDER BY Y DESC) 开窗函数

场景 01 (IN 语句 排序 decode() 函数):html

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 不是数字,而是字符串呢? oracle

如  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) spa

其中 decode 函数的结果做为 order by 的内容,括号内的参数为 (排序字段,值,顺序,值,顺序……),其中,顺序值越小,排序越靠前code

场景 02 (分组排序查询,开窗函数 OVER (PARTITION BY COL1 ORDER BY COL2) ):htm

1,平时作项目的时候,咱们会常常遇到这种状况,假设一张表,每一天都会给表中的每个种类添加一条数据,如今咱们要求根据某个日期查询出全部种类的对应数据,blog

这很简单,如  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,更多关于开窗函数的用法请参考  这个

相关文章
相关标签/搜索