zoukankan      html  css  js  c++  java
  • SQL 的Over 子句

    参数:

    PARTITION BY
    将查询结果集分为多个分区。 开窗函数分别应用于每个分区,并为每个分区重新启动计算。

    <ORDER BY 子句>
    定义结果集的每个分区中行的逻辑顺序。 也就是说,它指定按其执行开窗函数计算的逻辑顺序。

     
    数据值:
    rank () over , row_number() over ,rank_dense ()

    总结如下:
    我创建了一个表,数据如下,
    SQL> select * from test;
           A1       A2
    ---------- ----------
          1       3
          2       4
          3       2
          3       5
          4       2
    然后用rank () over,
    SQL> select a1,a2,rank () over (order by a1) rank from test;
           A1       A2    RANK
    ---------- ---------- ----------
          1       3       1
          2       4       2
          3       2       3
          3       5       3
          4       2       5
    SQL> select a1,a2,rank () over (order by a2) rank from test;
           A1       A2    RANK
    ---------- ---------- ----------
          3       2       1
          4       2       1
          1       3       3
          2       4       4
          3       5       5
    原来这个就是用来看排名的东东啊。
    接下来看看row_number() over,
    SQL> select a1,a2, row_number () over (order by a1) rank from test;
           A1       A2    RANK
    ---------- ---------- ----------
          1       3       1
          2       4       2
          3       2       3
          3       5       4
          4       2       5
    SQL> select a1,a2, row_number () over (order by a2) rank from test;
           A1       A2    RANK
    ---------- ---------- ----------
          3       2       1
          4       2       2
          1       3       3
          2       4       4
          3       5       5
    黄色标出了区别,这个很容易看清楚吧~~~
    再看看dense_rank () over
    SQL> select a1,a2, dense_rank () over (order by a1) rank from test;
           A1       A2    RANK
    ---------- ---------- ----------
          1       3       1
          2       4       2
          3       2       3
          3       5       3
          4       2       4
    dense_rank在有出现相同的rank后,rank的值是紧接上一次的rank值。
    可以这么理解,我们通常意义上的top N 的实现应该采用row_number() over 而不是rank () over,因为row_number 是给记录加一个序号标记,而rank 是相当于进行排序后的排名,也就是如果排序列是相同的,那么他们的返回值也是相同的,而row_number则不可能返回相同值。
    放到一起看看吧:
    SQL> select a1,a2,
    2 rank () over (order by a1) rank,
    3 dense_rank () over (order by a1) dense_rank,
    4 row_number () over (order by a1) row_number
    5 from test;
           A1       A2    RANK DENSE_RANK ROW_NUMBER
    ---------- ---------- ---------- ---------- ----------
          1       3       1       1       1
          2       4       2       2       2
          3       2       3       3       3
          3       5       3       3       4
          4       2       5       4       5

    row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序).
    rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).
    dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的
  • 相关阅读:
    【数学】三分法
    【数学】【背包】【NOIP2018】P5020 货币系统
    【数学】【CF27E】 Number With The Given Amount Of Divisors
    【单调队列】【P3957】 跳房子
    【极值问题】【CF33C】 Wonderful Randomized Sum
    【DP】【CF31E】 TV Game
    【神仙题】【CF28D】 Don't fear, DravDe is kind
    【线段树】【CF19D】 Points
    【字符串】KMP字符串匹配
    【二维树状数组】【CF10D】 LCIS
  • 原文地址:https://www.cnblogs.com/colder/p/1998506.html
Copyright © 2011-2022 走看看