/* NOTE: The warning about null values being eliminated by an aggregate is very expected. The warning can be disabled, or I could avoid it in the SQL code, but I did not do either for this purpose. */ DROP TABLE IF EXISTS #MyPairings CREATE TABLE #MyPairings ( DemandID int NOT NULL , SupplyID int NOT NULL , TradeQuantity decimal(19,06) NOT NULL ) INSERT #MyPairings ( DemandID , SupplyID , TradeQuantity ) SELECT Z.DemandID , Z.SupplyID , Z.Running - ISNULL(LAG(Z.Running) OVER (ORDER BY Z.Running), 0) AS TradeQuantity FROM (SELECT CASE WHEN W.DemandID IS NOT NULL THEN W.DemandID ELSE MIN(W.DemandID) OVER (ORDER BY W.Running ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) END AS DemandID , CASE WHEN W.SupplyID IS NOT NULL THEN W.SupplyID ELSE MIN(W.SupplyID) OVER (ORDER BY W.Running ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) END AS SupplyID , W.Running FROM (SELECT D.ID AS DemandID , S.ID AS SupplyID , ISNULL(D.Running, S.Running) AS Running FROM (SELECT A.ID , SUM(A.Quantity) OVER (PARTITION BY A.Code ORDER BY A.ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Running FROM dbo.Auctions AS A WHERE A.Code = 'D') AS D FULL JOIN (SELECT A.ID , SUM(A.Quantity) OVER (PARTITION BY A.Code ORDER BY A.ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Running FROM dbo.Auctions AS A WHERE A.Code = 'S') AS S ON D.Running = S.Running) AS W) AS Z WHERE Z.DemandID IS NOT NULL AND Z.SupplyID IS NOT NULL