使用Order by进行TSQL分区

时间:2013-10-04 07:33:47

标签: sql-server tsql sql-order-by partition

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

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

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

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

由于

1 个答案:

答案 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函数等。

偶尔您会体验到它同时被用于两种意义 - 当最外层语句包含TOPOFFSET / FETCH时,它会用于两种目的。