sql - sql查询: Rank and partition oracle的说明

标签 sql oracle rank window-functions

我正在使用 Oracle 数据库,并被困在这个查询中,我不明白这是如何工作的,我已经删除了所有不必要的信息,查询已归结为:

 select RANK () OVER (PARTITION BY A_pk ORDER BY B_pk DESC) as column from Table_C

有人可以解释一下这是如何工作的吗?

最佳答案

假设您有下表:

SELECT *, 
       ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col2) AS [ROW_NUMBER],
       RANK() OVER(PARTITION BY col1 ORDER BY col2) [RANK],
       DENSE_RANK() OVER(PARTITION BY col1 ORDER BY col2) [DENSE_RANK]
FROM SomeTable

col1    col2  |  ROW_NUMBER RANK    DENSE_RANK
1       1     |  1          1       1
1       1     |  2          1       1
1       5     |  3          3       2
1       5     |  4          3       2
1       9     |  5          5       3
1       9     |  6          5       3
2       1     |  1          1       1
2       1     |  2          1       1
2       1     |  3          1       1
2       3     |  4          4       2
2       3     |  5          4       2

ROW_NUMBER: 这些是window ranking功能。这意味着当您按某些列分区时,函数将在该分区的窗口中运行。想象一下:

col1    col2
/*------*\
|1      1|
|1      1|
|1      5|  <--window 1
|1      5|
|1      9|
|1      9|
\*------*/

/*------*\
|2      1|
|2      1|
|2      1|  <--another window 2
|2      3|
|2      3|
\*------*/

当窗口改变时,一切都会重置!所以对于ROW_NUMBER您通过 col2 订购并按该顺序分配增量编号。当窗口更改时,函数会重置并从 1 开始.

排名:

此函数将计算值为 col2 的行数小于 col2 的值在当前行中加 1。例如在 window 1 中对于 col2 = 5 的行有 2 行 col2 = 1 ,所以2 + 1 = 3 。对于 col2 = 9 的行有 4 行,所以 4 + 1 = 5 .

DENSE_RANK:

RANK 相同但它会计算前面的DISTINCT值!例如,对于 col2 = 9 的行col2 = 1 and 5 有 2 个不同的值所以2 + 1 = 3

关于sql - sql查询: Rank and partition oracle的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30772622/

相关文章:

sql - 排名增加仅针对行值的变化

php - 创建排名基础系统并更新排名

c++ - std::rank 的目的是什么?

mysql - 具有两个连接表的表的主键/外键

oracle - sqoop-连接到oracle并将数据导入IBM BigInsights中的HDFS

sql - SQL : cleaning a DB, checking that there's no violation and maybe rolling back

sql - ORACLE PL SQL 中的三行前导函数

mysql - 按 DATETIME 值和时间范围加载行

mysql - 是否可以插入列表而不是字符串?

php - 如何在不删除mysql中当前值的情况下更新行?