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次の 2 つの役割があります。

  • 別の機能がどのように機能するかを実際に定義すること。これはTOP、たとえば、またはOVER()パーティション関数内で使用する場合に当てはまります。並べ替えを行う必要はありません。「この定義は、結果セット内の行が特定の順序で発生することを考慮した場合にのみ意味があります。これが私が使用したい順序です」
  • 結果セットのソート順を指定します。これはORDER BY、サブクエリ、CTE、OVER()パーティション関数などではなく、特定のクエリの一部である最も外側のステートメントの句である場合に当てはまります。

場合によっては、一度に両方の意味で使用されることがあります。最も外側のステートメントに aTOPまたはOFFSET/が含まれている場合はFETCH、両方の目的で使用されます。

于 2013-10-04T07:49:50.477 に答える