在Oracle中选择N Row

时间:2010-12-12 10:39:12

标签: oracle rank dense-rank

假设我们有以下数据:

Key Value Desired Rank
--- ----- ------------
P1    0.6            2    
P1    0.6            2    
P1    0.6            2    
P2    0.8            1
P2    0.8            1
P3    0.6            3
P3    0.6            3

我想选择值DESC 排序的不同,以便在支持分页的网格中显示。

我不知道如何将排名生成为 Desired Rank列中显示的值。这样我就可以在数据集上正确分页

当我尝试使用:DENSE_RANK()OVER(ORDER BY值)时,结果是

Key Value   DENSE_RANK() OVER(ORDER BY value)
--- ----- ------------
P1    0.6            2    
P1    0.6            2
P1    0.6            2    
P2    0.8            1
P2    0.8            1
P3    0.6            2    
P3    0.6            2

当我尝试选择前两个键“在1和2之间排名”时,我收到了3个键。这破坏了所需的分页机制。

有什么想法吗?

由于

2 个答案:

答案 0 :(得分:1)

如果你想要不同的键和值,为什么不使用distinct?

select distinct
  t.Key,
  t.Value
from
  YourTable t
order by
  t.value

你是否需要排名?

如果你这样做,你仍然可以

select distinct
  t.Key,
  t.Value,
  dense_rank() over () order by (t.Value, t.Key) as Rank
from
  YourTable t
order by
  t.value

这样做也没有明显的区别。

答案 1 :(得分:1)

  

'当我尝试选择前两个   密钥“在1和2之间排名”我收到   回3键。'

这是因为您只按VALUE排序,因此具有相同值的所有KEYS都被赋予相同的排名。因此,您需要在订购子句中包含KEY。像这样:

DENSE_RANK() OVER (ORDER BY key ASC, value DESC)