我注意到当我使用下面的分区时
SELECT
ROW_NUMBER() OVER(PARTITION BY categoryid
ORDER BY unitprice, productid) AS rownum,
categoryid, productid, productname, unitprice
FROM Production.Products;
结果集在适当的分区和顺序中相应地返回给我。
这是否意味着我不必在最后提供Order BY子句以绝对保证我想要的订单?
由于
答案 0 :(得分:8)
没有
为了保证结果顺序,必须使用适用于最外层查询的ORDER BY
。其他任何事都只是巧合。
SELECT
ROW_NUMBER() OVER(PARTITION BY categoryid
ORDER BY unitprice, productid) AS rownum,
categoryid, productid, productname, unitprice
FROM Production.Products
ORDER BY categoryid,unitprice,productid;
ORDER BY
有两个角色:
TOP
时,或在OVER()
分区函数中使用时,都是如此。它不会要求排序,它只是说“如果我们认为结果集中的行按特定顺序发生,这个定义才有意义 - 这是我想要使用的那个”< / LI>
ORDER BY
子句,它是特定查询的一部分,而不是子查询,CTE,OVER()
paritition函数等。偶尔您会体验到它同时被用于两种意义 - 当最外层语句包含TOP
或OFFSET
/ FETCH
时,它会用于两种目的。