使用Order by进行TSQL分区

The*_*ies 3 t-sql sql-server sql-order-by partition

我注意到当我使用下面的分区时

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

结果集在适当的分区和顺序中相应地返回给我.

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

谢谢

Dam*_*ver 10

没有.

要保证结果顺序,必须使用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;
Run Code Online (Sandbox Code Playgroud)

ORDER BY 有两个角色:

  • 实际定义另一个功能的工作原理.TOPOVER()分区函数中使用,比如说或在分区函数中使用时都是如此.它不需要进行排序,它只是说"如果我们认为结果集中的行按特定顺序发生,这个定义才有意义 - 这是我想要使用的那个"
  • 指定结果集的排序顺序.当它ORDER BY是作为特定查询一部分的最外层语句的子句时,这是正确的- 不在子查询,CTE,OVER()paritition函数等中.

偶尔你会遇到它同时在两种意义上使用 - 当最外面的语句包含a TOPOFFSET/时FETCH,它就用于两种目的.