场景 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) 开窗函数的更多相关文章

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

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

  3. ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN DESC)函数的使用

    ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN DESC)函数的作用是指定COLUMN(列)进行分区,在分区内指定COLUMN(列)进行排序 ...

  4. ROW_NUMBER() OVER (PARTITION BY M ORDER BY N DESC 好用

    做查询的时候,发现一个问题,连接之后,有一个表里面有重复的数据.导致另一个表的记录,跟着重复了几遍.用户曾经反馈,评论会多出来几条, 一直没找到原因.只到发现这个问题.才发现了原因.因为一直用sql ...

  5. 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 判断语句,用于 ...

  6. row_number() over (partition by....order by...)用法 分组排序

    row_number() over (partition by....order by...)用法 分组排序 row_number() OVER (PARTITION BY COL1 ORDER BY ...

  7. Oracle 高级排序函数 和 高级分组函数

    高级排序函数: [ ROW_NUMBER()| RANK() | DENSE_RANK ] OVER (partition by xx order by xx) 1.row_number() 连续且递 ...

  8. Oracle高级函数

    http://www.cnblogs.com/chen1388/archive/2010/07/06/1771919.html decode函数: decode(aa, 1, 'xs', 2, 'ps ...

  9. ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)用法,先分组,然后在组内排名,分组计算,主表与附表一对多取唯一等

    ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)用法 今天在使用多字段去重时,由于某些字段有多种可能性,只需根据部分字段进行去重,在网上看到了row ...

随机推荐

  1. 配置VScode c语言环境

    vscode 提示 <sys/socket.h>找不到, 原来是不同平台上,头文件不一样. 参考:https://blog.csdn.net/qq_28581077/article/det ...

  2. 微信之通过AppID和AppSecret获取access_token

    最近在搞微信公众平台这方面的东西,,但实际使用的时候发现和access_token有关的接口都无法正常调用,于是debug了下,发现获取到了AppID和AppSecret,在最后请求access_to ...

  3. C#中集合ArrayList与Hashtable的使用

    C#中集合ArrayList与Hashtable的使用 http://blog.csdn.net/linukey/article/details/42506819 ArrayList: 一. 注意事项 ...

  4. What Is React?--MVC

    React is a declarative, efficient, and flexible JavaScript library for building user interfaces. It ...

  5. (知识点3)附加到数字的“.f”的目的是什么?

    默认情况下3.2被视为double; 所以为了强制编译器将其视为float,你需要f在最后编写. float a = 3.2; if ( a == 3.2 ) cout << " ...

  6. UFUN函数 UF_ATTR函数(UF_ATTR_read_value 函数用法)

    //此函数的功能是输入tag值,返回与属性标题对应的属性值 static string read_attr(tag_t object_tag) { UF_initialize(); ]="零 ...

  7. Hibernate的批量查询——原生sql查询

    1.查询所有的学生信息: (1)查询结果中,一条信息放入到一个数组中,从list集合中取出数组,并对数组进行遍历. public class GeneratorTest { public static ...

  8. 洛谷 P1099 树网的核+P2491 [SDOI2011]消防

    写在前面:由于是双倍经验就放一块了,虽然数据范围差的有点大. 题目链接 题意:在树的直径上选择一条长度不超过s的路径使这条路径上的点到树上任意点的最大距离最小. 这题数据好像非常水,我写了上界n^2不 ...

  9. GoCN每日新闻(2019-11-05)

    GoCN每日新闻(2019-11-05) GoCN每日新闻(2019-11-05) 1. Protobuf 终极教程 https://colobu.com/2019/10/03/protobuf-ul ...

  10. 第08组 Alpha事后诸葛亮

    组长博客 点这里! 总结思考 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 弥补Powerpoint中模板转换存在的缺陷,完善PPT模板一键转换的功能 ...