为什么我们不能使用rank()分析函数删除表中的重复项?

abhi1489

我创建了一个emp表,其中包含以下记录。

    create table emp(
    EMPNO  integer,
    EMPNAME varchar2(20),
    SALARY  number);

select * from emp;

empno empname  salary
10    bill     2000
11    bill     2000
12    mark     3000
12    mark     3000
12    mark     3000
12    philip   3000
12    john     3000
13    tom      4000
14    tom      4000
14    jerry    5000
14    matt     5000
15    susan    5000

为了删除重复项,我一直在使用rownum()函数以及partition by和order by子句进行查询,如下所示:

delete from emp where rowid in
(
select rid from
(
select rowid rid,
row_number() over(partition by empno order by empno) rn
from emp
)
where rn > 1
);
--6 rows deleted

该查询将删除所有具有重复empno的员工记录,结果看起来像这样:

empno empname  salary
10    bill     2000
11    bill     2000
12    mark     3000
13    tom      4000
14    tom      4000
15    susan    5000

当我使用内部查询来获取表中所有结果的行号时,它将得到以下结果:

select rowid as rid,empno,empname,
row_number() over(partition by empno order by empno) rn
from emp;

rowid                         rownumber
AACDJUAAPAAGLlTAAA  10  bill    1
AACDJUAAPAAGLlTAAB  11  bill    1
AACDJUAAPAAGLlTAAE  12  mark    1
AACDJUAAPAAGLlTAAD  12  mark    2
AACDJUAAPAAGLlTAAC  12  mark    3
AACDJUAAPAAGLlTAAF  12  philip  4
AACDJUAAPAAGLlTAAG  12  john    5
AACDJUAAPAAGLlTAAH  13  tom     1
AACDJUAAPAAGLlTAAI  14  tom     1
AACDJUAAPAAGLlTAAJ  14  jerry   2
AACDJUAAPAAGLlTAAK  14  matt    3
AACDJUAAPAAGLlTAAL  15  susan   1

但是,当我使用rank()代替rownumber()函数时,它给了我以下结果:

select rowid as rid,empno,empname,
rank() over(partition by empno order by empno) rn
from emp;

rowid                          rank
AACDJUAAPAAGLlTAAA  10  bill    1
AACDJUAAPAAGLlTAAB  11  bill    1
AACDJUAAPAAGLlTAAE  12  mark    1
AACDJUAAPAAGLlTAAD  12  mark    1
AACDJUAAPAAGLlTAAC  12  mark    1
AACDJUAAPAAGLlTAAF  12  philip  1
AACDJUAAPAAGLlTAAG  12  john    1
AACDJUAAPAAGLlTAAH  13  tom     1
AACDJUAAPAAGLlTAAI  14  tom     1
AACDJUAAPAAGLlTAAJ  14  jerry   1
AACDJUAAPAAGLlTAAK  14  matt    1
AACDJUAAPAAGLlTAAL  15  susan   1

因此,我的问题是,即使存在重复的Empid,为什么rank()仍对表中的所有记录赋予相同的值?

卢卡斯·埃德(Lukas Eder)

这就是RANK()工作方式RANK对于分区中的等排行获得不同的将是非常令人惊讶的。实际上,该ORDER BY子句是RANK分区中重要的驱动程序,但是由于您对分区使用与排序相同的列,因此很明显,每一行在各自的分区中排在首位(因为它们是唯一的)分区中的值)

请参阅此博客文章中的说明,其中此SQL(PostgreSQL语法)

SELECT
  v,
  ROW_NUMBER() OVER (window) row_number,
  RANK()       OVER (window) rank,
  DENSE_RANK() OVER (window) dense_rank
FROM t
WINDOW window AS (ORDER BY v)
ORDER BY v

...产生这个输出

+---+------------+------+------------+
| V | ROW_NUMBER | RANK | DENSE_RANK |
+---+------------+------+------------+
| a |          1 |    1 |          1 |
| a |          2 |    1 |          1 |
| a |          3 |    1 |          1 |
| b |          4 |    4 |          2 |
| c |          5 |    5 |          3 |
| c |          6 |    5 |          3 |
| d |          7 |    7 |          4 |
| e |          8 |    8 |          5 |
+---+------------+------+------------+

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我们不能使用rank()分析函数删除表中的重复项?

来自分类Dev

为什么我们不能使用表达式强健的构造函数?

来自分类Dev

为什么我们不能使用GetConstructor找到Int32的默认构造函数?

来自分类Dev

为什么我们不能使用scanf直接初始化struct中的变量?

来自分类Dev

为什么我们不能使用Java子类方法中的super关键字来调用超类构造函数?

来自分类Dev

为什么我们不能使用单个ListItem对象在DropDownList ASP.net中添加项目

来自分类Dev

为什么我们不能使用C中的表达式为全局变量赋值?

来自分类Dev

为什么我们不能使用指向字符串的指针?

来自分类Dev

为什么我们不能使用push方法来迭代javascript数组?

来自分类Dev

为什么我们不能使用忽略的可选参数调用委托实例?

来自分类Dev

REST为什么我们不能使用字符作为查询参数

来自分类Dev

为什么我们不能使用动态方法代替Generic(T)方法

来自分类Dev

为什么我们不能使用192.168.1作为子网掩码

来自分类Dev

为什么我们需要分析oracle表

来自分类Dev

为什么我们不能调用原型函数?

来自分类Dev

为什么我们不能立即调用函数声明?

来自分类Dev

为什么我们不能在main函数中定义函数?

来自分类Dev

为什么我们不能/不能在内核编程中同样使用OOP概念?

来自分类Dev

为什么我们不能使用超类的引用变量来访问其子类的方法(超类中没有的方法)?

来自分类Dev

为什么我们不能使用rvalue volatile int &&初始化对const int的引用?

来自分类Dev

为什么我们不能使用自己的mysql数据库而不是django数据库?

来自分类Dev

如果“反应”是“反应”的默认导出,为什么我们不能使用其他名称代替“反应”

来自分类Dev

为什么我们不能使用带有数组名称的间接运算符?

来自分类Dev

为什么我们不能使用 esp 寄存器直接引用内存地址?

来自分类Dev

为什么我们不能在构造函数中创建非静态自引用对象

来自分类Dev

为什么我们不能在Java构造函数中传递字符串

来自分类Dev

为什么我们不能在静态内部类中定义main函数?

来自分类Dev

为什么我们不能在构造函数中创建非静态自引用对象

来自分类Dev

为什么我们不能在jquery中使用setAtrribute函数?

Related 相关文章

  1. 1

    为什么我们不能使用rank()分析函数删除表中的重复项?

  2. 2

    为什么我们不能使用表达式强健的构造函数?

  3. 3

    为什么我们不能使用GetConstructor找到Int32的默认构造函数?

  4. 4

    为什么我们不能使用scanf直接初始化struct中的变量?

  5. 5

    为什么我们不能使用Java子类方法中的super关键字来调用超类构造函数?

  6. 6

    为什么我们不能使用单个ListItem对象在DropDownList ASP.net中添加项目

  7. 7

    为什么我们不能使用C中的表达式为全局变量赋值?

  8. 8

    为什么我们不能使用指向字符串的指针?

  9. 9

    为什么我们不能使用push方法来迭代javascript数组?

  10. 10

    为什么我们不能使用忽略的可选参数调用委托实例?

  11. 11

    REST为什么我们不能使用字符作为查询参数

  12. 12

    为什么我们不能使用动态方法代替Generic(T)方法

  13. 13

    为什么我们不能使用192.168.1作为子网掩码

  14. 14

    为什么我们需要分析oracle表

  15. 15

    为什么我们不能调用原型函数?

  16. 16

    为什么我们不能立即调用函数声明?

  17. 17

    为什么我们不能在main函数中定义函数?

  18. 18

    为什么我们不能/不能在内核编程中同样使用OOP概念?

  19. 19

    为什么我们不能使用超类的引用变量来访问其子类的方法(超类中没有的方法)?

  20. 20

    为什么我们不能使用rvalue volatile int &&初始化对const int的引用?

  21. 21

    为什么我们不能使用自己的mysql数据库而不是django数据库?

  22. 22

    如果“反应”是“反应”的默认导出,为什么我们不能使用其他名称代替“反应”

  23. 23

    为什么我们不能使用带有数组名称的间接运算符?

  24. 24

    为什么我们不能使用 esp 寄存器直接引用内存地址?

  25. 25

    为什么我们不能在构造函数中创建非静态自引用对象

  26. 26

    为什么我们不能在Java构造函数中传递字符串

  27. 27

    为什么我们不能在静态内部类中定义main函数?

  28. 28

    为什么我们不能在构造函数中创建非静态自引用对象

  29. 29

    为什么我们不能在jquery中使用setAtrribute函数?

热门标签

归档