sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server 2008-versionen av OVER(... Rader ogränsade föregående)

Ett enkelt sätt att göra det är att använda en korrelerad underfråga i CROSS APPLY .

Om ditt bord är mer eller mindre stort, så skulle din nästa fråga vara hur man gör det snabbt. Index på PlaceB, Product, PickTime INCLUDE (Qty) borde hjälpa. Men om ditt bord är riktigt stort skulle markören vara bättre.

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;

Åh, och om (PlaceB, Product, PickTime) är inte unik, får du något annorlunda resultat än den ursprungliga frågan med SUM() OVER . Om du behöver exakt samma resultat måste du använda någon extra kolumn (som ID ) för att lösa banden.




  1. Skapa ett meddelandesystem i DB (särskilt MySQL)

  2. Varför MySQL COUNT utan tabellnamn ger 1

  3. Hur skapar jag ett dokument på servern genom att köra en befintlig lagrad procedur eller sql-satsen för den proceduren på en R2008 sql-server

  4. Hur konverterar man Lat Long till adress i php med json api?