sql >> データベース >  >> RDS >> Sqlserver

SQL Server 2008 バージョンの OVER(... Rows Unbounded Preceding)

    それを行う簡単な方法の 1 つは、CROSS APPLY で相関サブクエリを使用することです。 .

    テーブルが多かれ少なかれ大きい場合、次の質問はそれを高速化する方法です。 PlaceB, Product, PickTime INCLUDE (Qty) のインデックス 助けるべきです。ただし、テーブルが非常に大きい場合は、カーソルの方が適しています。

    WITH
    ADVPICK
    AS
    (
        SELECT 'A' as PlaceA,PlaceB, case when PickTime = '00:00' then '07:00' else isnull(picktime,'12:00') end as picktime, cast(Product as int) as product, Prd_Description, -Qty AS Qty FROM t_pick_orders
        UNION ALL
        SELECT 'A' as PlaceA,PlaceB, '0', cast(Code as int) as product, NULL, Stock FROM t_pick_stock
    )
    ,stock_post_order
    AS
    (
        SELECT
            *
        FROM
            ADVPICK AS Main
            CROSS APPLY
            (
                SELECT SUM(Sub.Qty) AS new_qty
                FROM ADVPICK AS Sub
                WHERE
                    Sub.PlaceB = Main.PlaceB
                    AND Sub.Product = Main.Product
                    AND T.PickTime <= Main.PickTime
            ) AS A
    )
    SELECT
        *,
        CASE WHEN new_qty > qty THEN new_qty ELSE qty END AS order_shortfall
    FROM
        stock_post_order
    WHERE
        new_qty < 0
    ORDER BY PlaceB, picktime, product;
    

    ああ、もし (PlaceB, Product, PickTime) SUM() OVER を使用すると、元のクエリとは多少異なる結果が得られます。 .まったく同じ結果が必要な場合は、追加の列 (ID など) を使用する必要があります。 ) を使用して同点を解決します。




    1. oracle10gで参照カーソルを使用してレコード数を取得する方法

    2. MySQLで期限切れのデータ行を自動削除

    3. オフセット制限のあるクエリの選択が遅すぎる

    4. テーブルの作成コマンドSQLで正しいParanthesisがありません