`

oracle row_number() over ,rank() over ,dense_rank() over ,keep 函数比较

 
阅读更多

create table test2 as
select 1 id, 111 mc,1 sl from dual union all
select 1 , 222,6 from dual union all
select 1 , 333,2 from dual union all
select 1 , 555,3 from dual union all
select 1 , 666,3 from dual union all
select 2 , 111,1 from dual union all
select 2 , 222,1 from dual union all
select 2 , 333,2 from dual union all
select 2 , 555,2 from dual

select t.* ,
row_number() over (partition by id order by t.sl) row_num,
rank() over (partition by id order by t.sl) rank,
dense_rank() over (partition by id order by t.sl) denserank
from test2 t

        ID         MC         SL    ROW_NUM       RANK DENSERANK
---------- ---------- ---------- ---------- ---------- ----------
         1        111          1          1          1          1
         1        333          2          2          2          2
         1        666          3          3          3          3
         1        555          3          4          3          3
         1        222          6          5          5          4
         2        111          1          1          1          1
         2        222          1          2          1          1
         2        555          2          3          3          2
         2        333          2          4          3          2

可知:

dense_rank在做排序时如果遇到列有重复值,则重复值所在行的序列值相同,而其后的序列值依旧递增,rank则是重复值所在行的序列值相同,但其后的序列值从+重复行数开始递增,而row_number则不管是否有重复行,(分组内)序列值始终递增

keep(dense_rank first/last order by )

select id,mc,sl,
2 min(mc) keep(dense_rank first order by sl) over(partition by id) min_mc,
3 min(mc) keep(dense_rank last order by sl) over(partition by id) min_mc
4   from test2;

        ID         MC         SL     MIN_MC     MIN_MC
---------- ---------- ---------- ---------- ----------
         1        111          1        111        222
         1        222          6        111        222
         1        333          2        111        222
         1        555          3        111        222
         1        666          3        111        222
         2        111          1        111        333
         2        222          1        111        333
         2        333          2        111        333
         2        555          2        111        333

9 rows selected

 

 

转自:

http://blog.163.com/dykj_dxj/blog/static/2549252520108271158241/

分享到:
评论

相关推荐

    Oracle开发之分析函数总结

    `RANK()`, `DENSE_RANK()`, `ROW_NUMBER()`以及`NTILE()`这些函数用于为每一行分配一个唯一的排名。`RANK()`会跳过相同的排名,`DENSE_RANK()`则不会,`ROW_NUMBER()`为每行分配连续的数字。`NTILE()`则将结果集分成...

    Oracle开发之分析函数(Top/Bottom N、First/Last、NTile)

    在Oracle中,我们可以使用`RANK()`, `DENSE_RANK()`, 或 `ROW_NUMBER()` 函数配合`ORDER BY`子句来实现。例如,如果我们想找到每个区域销售额最高的前5个客户,可以这样写: ```sql SELECT region_id, customer_...

    Oracle 设计高级编码

    - **MIN(mc) KEEP (DENSE_RANK FIRST ORDER BY sl) OVER (PARTITION BY id)**: 按`id`分组后,根据`sl`排序,取每个分组的最小值。 - **ROW_NUMBER()**: 不同于其他排名函数,即使值相同也不会有相同的排名。 - **...

    Oracle事例

    <3>.pctfree(index)=(maximum number of rows-initial number of rows)*100/maximum number of rows <4>.creating reverse key indexes sql> create unique index xay_id on xay(a) reverse pctfree 30 ...

    2024 ETL开发公司面试题

    MAX(Course) KEEP (DENSE_RANK FIRST ORDER BY Rank) AS "HighestScoredCourse", MAX(Course) KEEP (DENSE_RANK LAST ORDER BY Rank) AS "LowestScoredCourse" FROM RankedScores GROUP BY Student; ``` 4. **...

Global site tag (gtag.js) - Google Analytics