`

ORACLE中row_number over(partition by col1 order by col2)用法

 
阅读更多
文章转自:

[url]
http://space.itpub.net/7366728/viewspace-594893
[/url]

row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的).

  与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码.

  row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序).

  rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).

  dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的 .

  lag(arg1,arg2,arg3):
arg1是从其他行返回的表达式
arg2是希望检索的当前行分区的偏移量。是一个正的偏移量,时一个往回检索以前的行的数目。
arg3是在arg2表示的数目超出了分组的范围时返回的值。

看几个SQL语句:

语句一:

select row_number() over(order by sale/cnt desc) as sort, sale/cnt
from (
select -60 as sale,3 as cnt from dual union
select 24 as sale,6 as cnt from dual union
select 50 as sale,5 as cnt from dual union
select -20 as sale,2 as cnt from dual union
select 40 as sale,8 as cnt from dual);

执行结果:

          SORT       SALE/CNT
---------- ----------
             1             10
             2              5
             3              4
             4            -10
             5            -20


语句二:查询员工的工资,按部门排序

select ename,sal,row_number() over (partition by deptno order by sal desc) as sal_order from scott.emp;

执行结果:

ENAME                           SAL      SAL_ORDER
-------------------- ---------- ----------
KING                           5000              1
CLARK                          2450              2
MILLER                         1300              3
SCOTT                          3000              1
FORD                           3000              2
JONES                          2975              3
ADAMS                          1100              4
SMITH                           800              5
BLAKE                          2850              1
ALLEN                          1600              2
TURNER                         1500              3
WARD                           1250              4
MARTIN                         1250              5
JAMES                           950              6

已选择14行。

语句三:查询每个部门的最高工资

select deptno,ename,sal from
     (select deptno,ename,sal,row_number() over (partition by deptno order by sal desc) as sal_order
         from scott.emp) where sal_order <2;

执行结果:

       DEPTNO ENAME                          SAL
---------- -------------------- ----------
           10 KING                          5000
           20 SCOTT                         3000
           30 BLAKE                         2850

已选择3行。

语句四:

select deptno,sal,rank() over (partition by deptno order by sal) as rank_order from scott.emp order by deptno;

执行结果:

     DEPTNO         SAL RANK_ORDER
---------- ---------- ----------
         10        1300           1
         10        2450           2
         10        5000           3
         20         800           1
         20        1100           2
         20        2975           3
         20        3000           4
         20        3000           4
         30         950           1
         30        1250           2
         30        1250           2
         30        1500           4
         30        1600           5
         30        2850           6

已选择14行。

语句五:

select deptno,sal,dense_rank() over(partition by deptno order by sal) as dense_rank_order from scott.emp order by deptn;
执行结果:

     DEPTNO         SAL DENSE_RANK_ORDER
---------- ---------- ----------------
         10        1300                 1
         10        2450                 2
         10        5000                 3
         20         800                 1
         20        1100                 2
         20        2975                 3
         20        3000                 4
         20        3000                 4
         30         950                 1
         30        1250                 2
         30        1250                 2
         30        1500                 3
         30        1600                 4
         30        2850                 5

已选择14行。

语句六:

select deptno,ename,sal,lag(ename,1,null) over(partition by deptno order by ename) as lag_ from scott.emp order by deptno;

执行结果:



     DEPTNO ENAME                        SAL LAG_
---------- -------------------- ---------- --------------------
         10 CLARK                       2450
         10 KING                        5000 CLARK
         10 MILLER                      1300 KING
         20 ADAMS                       1100
         20 FORD                        3000 ADAMS
         20 JONES                       2975 FORD
         20 SCOTT                       3000 JONES
         20 SMITH                        800 SCOTT
         30 ALLEN                       1600
         30 BLAKE                       2850 ALLEN
         30 JAMES                        950 BLAKE
         30 MARTIN                      1250 JAMES
         30 TURNER                      1500 MARTIN
         30 WARD                        1250 TURNER

已选择14行。




有这样一个sql语句:我有一个视图,里面数据有2亿,现在我要根据某个字段排重后,计算一下还有多少,我是这样查询的,但是速度太慢,请问是否有更快的方式?

select count(distinct user_msisdn) from tab_day_test



优化后的语句:select count(1)
from
(
select row_number() over(partition by c1,c2,c3,c4,c5 order by  c1) rw
from t1
)
where rw=1
这个只是个模板,根据具体情况再改!

分享到:
评论

相关推荐

    oracle的row_numer()函数的使用

    介绍了 row_number() over(order by column asc) 函数和 row_number() over(partition by column1 order by column2 asc) 的使用实例和方法

    RANK OVER()和ROW_NUMBER()OVER的使用

    介绍rank() over()分析函数和 row_number() over 的使用实例及其异同点

    row_number,根据多个字段过滤,partition by

    过滤方法有distinct 获取是整行 重复 但只想过滤2个或2个以上不是所有字段 怎么办? 根据多个字段过滤 比如表:teacher表 id ,name ,sex,idNumber,phone,date; 需求 根据name和idnumber和date过滤重复数据只取...

    SQL Server中row_number函数的常见用法示例详解

    select *,row_number() over(partition by column1 order by column2) as n from tablename 在上面语法中: PARTITION BY子句将结果集划分为分区。 ROW_NUMBER()函数分别应用于每个分区,并重新初始化每个分区的...

    深入探讨:oracle中row_number() over()分析函数用法

    row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。 与rownum的区别在于:使用rownum进行排序的...

    SQLServer中Partition By及row_number 函数使用详解

    partition by关键字是分析性函数的一部分,partition by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,本文给大家介绍SQLServer中Partition By及row_number 函数使用详解,需要的朋友参考下

    sqlserver巧用row_number和partition by分组取top数据

    SQL Server 2005后之后,引入了row_number()函数,row_number()函数的分组排序功能使这种操作变得非常简单。下面是一个简单示例: 代码如下: –1.创建测试表 create table #score ( name varchar(20), subject ...

    Oracle查询中OVER (PARTITION BY ..)用法

    主要介绍了Oracle查询中OVER (PARTITION BY ..)用法,内容和代码大家参考一下。

    sql利用row_number()取唯一记录方法

    row_number() over(partition by A order by B desc)

    SQLSERVER 2005的ROW_NUMBER、RANK、DENSE_RANK的用法

    语法:ROW_NUMBER () OVER ( [ &lt;partition&gt; ] &lt;order&gt; ) 。备注:ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。参数:&lt;partition&gt; :将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区...

    oracle中rownum和row_number()

    row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。 与rownum的区别在于:使用rownum进行排序的...

    sqlserver2005使用row_number() over分页的实现方法

    OVER(PARTITION BY COLUMN ORDER BY COLUMN) &lt;BR&gt; 例子: 代码如下: select * from ( select *, ROW_NUMBER() OVER(Order by a.CreateTime DESC ) AS RowNumber from table_name as a ) as b where RowNumber BETWEEN...

    SQL中的ROW NUMBER() OVER()

    原始数据展示 一:SQL展示 select id,name,age,salary,row_number()over(order by ...select id,name,age,salary,row_number()over(partition by id order by salary desc) rkfrom TEST_ROW_NUMBER_OVER tSQL语句后

    ROW_NUMBER SQL Server 2005的LIMIT功能实现(ROW_NUMBER()排序函数)

    语法: ROW_NUMBER() OVER([ &lt;partition&gt;] &lt;order&gt;) 备注: ORDER BY子句可确定在特定分区中为行分配唯一ROW_NUMBER的顺序。 参数: &lt;partition&gt; 将FROM子句生成的结果集划入应用了ROW_NUMBER函数的分区。 &lt;order&gt; ...

    SQL Server中row_number分页查询的用法详解

    ROW_NUMBER()函数将针对SELECT语句返回的每一行,从1...语法:ROW_NUMBER () OVER ([ &lt;partition&gt; ] &lt;order&gt;) 。 备注:ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。 参数:&lt;partition_by_cl

    Oracle 分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法

    ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序 而这个值就表示每组内部排序后的顺序编号(组内连续的唯一的) RANK() 类似,不过RANK 排序的时候跟派名次一样,...

    oracle分析函数在BI分析中应用事例

    1、 结构:聚合函数()over( partition by 字段1,字段2,字段3 order by 字段 desc/asc range between 数值/date preceding/flowing and 数值/date preceding/flowing) 聚合函数可以是:sum,count,avg,max,min,...

    oracle常用分析函数与聚合函数的用法

    今天是2019年第一天,在此祝大家新年快乐,梦想还在路上,让我们...rownumber ( ) over ( [partition by col] order by col ) rank() 是排名的函数,该函数组内排序后会进行跳号,分数相同的作为并列。 dense_rank()

Global site tag (gtag.js) - Google Analytics