我注意到当我使用如下分区时
SELECT
ROW_NUMBER() OVER(PARTITION BY categoryid
ORDER BY unitprice, productid) AS rownum,
categoryid, productid, productname, unitprice
FROM Production.Products;
结果集以正确的分区和顺序相应地返回给我。
这是否意味着我不必在最后提供 Order BY 子句来绝对保证我想要的订单?
谢谢
我注意到当我使用如下分区时
SELECT
ROW_NUMBER() OVER(PARTITION BY categoryid
ORDER BY unitprice, productid) AS rownum,
categoryid, productid, productname, unitprice
FROM Production.Products;
结果集以正确的分区和顺序相应地返回给我。
这是否意味着我不必在最后提供 Order BY 子句来绝对保证我想要的订单?
谢谢
不。
为保证结果顺序,您必须使用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()
分区函数等中。有时您会体验到它同时在两种意义上使用 - 当最外面的语句包含 aTOP
或OFFSET
/FETCH
时,它会同时用于两种用途。