我正在使用 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/