我在ORACLE中使用Between条件,以实现分页。我将按降序对CNT列上的数据进行排序,以便首先显示最多的计数值。
我正在获得具有正常顺序和行号顺序的不同行顺序。
以下是我的数据集:
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正在互换。我想修理订单。我怎么能这样做?
答案 0 :(得分:1)
您的问题是,您有两行cnt
的值相同。这带来了更大的稳定排序问题。
关系数据库中的排序不稳定(这个question的答案给出了稳定排序的良好描述)。也就是说,当order by
键具有相同的值时,它们可以按任何顺序出现。它们可以在不同的运行中以不同的顺序出现。
这实际上很明显。 SQL表表示无序集。也就是说,没有自然排序,因此无法定义稳定的排序。
如果要在排序中保持一致性,则需要确保键唯一地定义每一行。我通常有一个id列,可以添加为order by
的最后一个键。
在您的情况下,您可以使用模式:order by cnt desc, pattern
。
答案 1 :(得分:0)
ORDER BY CNT DESC, PATTERN
适用于您的情况。
如果没有,可能会使用pseudocolumn ORA_ROWSCN
ORDER BY CNT DESC, ORA_ROWSCN
如果您检索的记录不是同时批量插入的,那么这将有效。不知道你是否可以在窗口功能中使用它,试试吧