The SQL OVER() clause - when and why is it useful?

后端 未结 8 1246
有刺的猬
有刺的猬 2020-11-28 17:49
    USE AdventureWorks2008R2;
GO
SELECT SalesOrderID, ProductID, OrderQty
    ,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS \'Total\'
    ,AVG(OrderQty) OVER(PAR         


        
8条回答
  •  萌比男神i
    2020-11-28 18:25

    If you only wanted to GROUP BY the SalesOrderID then you wouldn't be able to include the ProductID and OrderQty columns in the SELECT clause.

    The PARTITION BY clause let's you break up your aggregate functions. One obvious and useful example would be if you wanted to generate line numbers for order lines on an order:

    SELECT
        O.order_id,
        O.order_date,
        ROW_NUMBER() OVER(PARTITION BY O.order_id) AS line_item_no,
        OL.product_id
    FROM
        Orders O
    INNER JOIN Order_Lines OL ON OL.order_id = O.order_id
    

    (My syntax might be off slightly)

    You would then get back something like:

    order_id    order_date    line_item_no    product_id
    --------    ----------    ------------    ----------
        1       2011-05-02         1              5
        1       2011-05-02         2              4
        1       2011-05-02         3              7
        2       2011-05-12         1              8
        2       2011-05-12         2              1
    

提交回复
热议问题