您的位置:首页 > 数据库 > Oracle

oracle 中的 ROW_NUMBER() OVER() 分析函数的用法(oracle去重方法)

2018-03-02 15:05 716 查看
ROW_NUMBER() OVER(partition by col1 order by col2) 表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内是连续且唯一的)。

举例:

1.表结构:
SQL> DESC T1;Name                                           Null?    Type------------------------------- ------- ----------------------------ID                                                    NUMBERNAME                                                    VARCHAR2(10)DATE1                                                    DATE
2.查看表数据:
SQL> SELECT * FROM T1;        ID NAME                           DATE1---------- ------------------ -----------       101 aaa                                  09-SEP-13       101 bbb                                 10-SEP-13       101 ccc                                  11-SEP-13       102 ddd                                 08-SEP-13       102 eee                                  11-SEP-13
3.ROW_NUMBER() OVER:

SQL> SELECT ID,NAME,DATE1,ROW_NUMBER() OVER(partition by ID order by DATE1 desc) as RN FROM T1;//表示根据 ID 字段分组,在分组内部根据 DATE1 字段排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内是连续且唯一的)。

    ID NAME               DATE1               RN---------- ------------------------------ ------------------ ----------       101 ccc                  11-SEP-13              1       101 bbb                 10-SEP-13              2       101 aaa                  09-SEP-13              3       102 eee                  11-SEP-13              1       102 ddd                 08-SEP-13              2

4.把上面语句作为一个子表语句,嵌入到另一条语句中:

SQL> SELECT ID,NAME,DATE1 FROM (SELECT ID,NAME,DATE1,ROW_NUMBER() OVER(partition by ID order by DATE1 desc) as RN FROM T1)T WHERE T.RN=1;
        ID NAME                           DATE1---------- ------------------------------ ------------------       101 ccc                                  11-SEP-13       102 eee                                  11-SEP-13
这样就达到了去除重复id的效果了,可以根据需要去除重复字段。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: