我有一个这样的查询......
with subquery as
(
SELECT A, B, C, D,
row_number() OVER(PARTITION BY X ORDER BY Y) as RN
FROM blah blah
ORDER BY A,B
LIMIT 100
)
SELECT C,D
FROM subquery
WHERE RN=1
如您所见,子查询已排序,但顶级查询未排序。
顶级查询没有做任何复杂的事情,它只是根据partition by子句进行选择。
子查询的排序顺序是否会保留在最终结果中?
对我测试过的各种数据集的观察表明排序顺序保持不变,但我不确定这是否只是一个幸运的巧合。
不,
order by
or 子查询不会影响外部结果的顺序。如果有的话,它可能会受到
order by
窗口函数的影响。但你永远不能依赖它。
如果您需要可以依赖的外部查询的特定顺序,则还必须使用
order by
there。简而言之,你不应该假设它确实如此。DBMS 可以在不违反任何规则的情况下以不同的顺序返回您的子查询。因此,即使您观察到版本 X 保留了订单,也可能会更改版本 Y。
您的查询包含一些有趣的复杂情况,其中从外部查询中删除了排序属性。一个好的优化器可能会从这些信息中受益,并在最外层以不同的顺序返回行。