sql – 在与ROW_NUM之间使用时,Oracle查询行顺序不同

我在ORACLE中使用Between条件来实现分页.我将按降序对C​​NT列上的数据进行排序,以便首先显示最多的计数值.

我正在获得具有正常顺序和行号顺序的不同行顺序.

以下是我的数据集:

PATTERN_TBL

PATTERN  |  CNT
1        |  3
Aaaa Aaa |  14
aaaaaa   |  3

普通查询:

SELECT PATTERN, CNT FROM PATTERN_TBL ORDER BY CNT DESC

PATTERN  |  CNT
Aaaa Aaa |  14
aaaaaa   |  3
1        |  3

查询之间:

SELECT ROW_N, PATTERN,CNT FROM (SELECT 
 ROW_NUMBER() OVER ( ORDER BY CNT DESC) AS ROW_N,
  PATTERN, CNT FROM PATTERN_TBL) 
WHERE ROW_N BETWEEN 1 AND 100 

PATTERN  |  CNT
Aaaa Aaa |  14
1        |  3
aaaaaa   |  3

在上述两个输出中,行#3和行#2正在互换.我想修理订单.我怎样才能做到这一点?

最佳答案 您的问题是您有两行具有相同的cnt值.这带来了更大的稳定排序问题.

关系数据库中的排序不稳定(这个question的答案给出了稳定排序的良好描述).也就是说,当按键的顺序具有相同的值时,它们可以按任何顺序出现.它们可以在不同的运行中以不同的顺序出现.

这显然是显而易见的. SQL表表示无序集.也就是说,没有自然排序,因此无法定义稳定排序.

如果要在排序中保持一致性,则需要确保键唯一地定义每一行.我通常有一个id列,可以作为订单的最后一个键添加.

在您的情况下,您可以使用模式:按cnt desc,pattern命令.

点赞