6

我注意到当我使用如下分区时

SELECT
ROW_NUMBER() OVER(PARTITION BY categoryid
ORDER BY unitprice, productid) AS rownum,
categoryid, productid, productname, unitprice
FROM Production.Products;

结果集以正确的分区和顺序相应地返回给我。

这是否意味着我不必在最后提供 Order BY 子句来绝对保证我想要的订单?

谢谢

4

1 回答 1

11

不。

为保证结果顺序,您必须使用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()分区函数中时,这是正确的。它不需要进行排序,它只是说“这个定义只有在我们认为结果集中的行以特定顺序出现时才有意义——这就是我想要使用的”
  • 规定结果集的排序顺序。ORDER BY当它是作为特定查询一部分的最外层语句上的子句时,这是正确的,而不是在子查询、CTE、OVER()分区函数等中。

有时您会体验到它同时在两种意义上使用 - 当最外面的语句包含 aTOPOFFSET/FETCH时,它会同时用于两种用途。

于 2013-10-04T07:49:50.477 回答