sql >> Databáze >  >> RDS >> Sqlserver

SQL Server 2008 verze OVER(... Předcházející řádky bez omezení)

Jedním přímočarým způsobem, jak to udělat, je použít korelovaný dílčí dotaz v CROSS APPLY .

Pokud je váš stůl více či méně velký, pak by vaší další otázkou bylo, jak to udělat rychle. Index na PlaceB, Product, PickTime INCLUDE (Qty) by měl pomoci. Ale pokud je vaše tabulka opravdu velká, kurzor by byl lepší.

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;

Jo, a pokud (PlaceB, Product, PickTime) není jedinečný, získáte poněkud odlišné výsledky od původního dotazu pomocí SUM() OVER . Pokud potřebujete přesně stejné výsledky, musíte použít další sloupec (například ID ) k vyřešení vazeb.




  1. Nelze vytvořit zdroj dat Eclipse do Oracle 12c pomocí 12c jar. Nicméně 11g funguje

  2. Nejlepší způsob, jak zabránit jedné osobě ve vytváření více účtů

  3. Jak mohu použít kolekci v rámci příkazu Oracle SQL

  4. Ekvivalent funkce FOUND_ROWS() v Postgresql