2016-05-03 3 views
1

Ich versuche, eine Self-Join verwenden, um eine kumulative Summe zu erhalten. Das Problem besteht darin, dass die Abfrage mehr als 2 Stunden ohne Ergebnis ausgeführt wird. Wie kann ich das beheben?Self Join verursacht Abfrage für immer

Select SUM(A.[GrossWeightKg] - A.[QtyLeftKg])/ 1000 AS DailyUsage 
    , SUM(a.[GrossWeightKg] - a.[QtyLeftKg])/ 1000 AS Cumulative 
FROM [PMECentral].[dbo].[FactActualItemUsage] A 
    LEFT OUTER JOIN [PMECentral].[dbo].[FactActualItemUsage] ff 
     ON a.ActualItemUsageSourceId >= ff.ActualItemUsageSourceId 
+0

in SQL-Server 2012 Sie so etwas wie 'SUM (a [GrossWeightKg].. - a [QtyLeftKg]) verwenden könnte OVER (ORDER BY ActualItemUsageSourceId Reihen zwischen UNBOUNDED PRECEDING UND AKTUELLE ROW)' ohne Selbst beitreten –

+0

Die Ausdrücke Für DailyUsage und Cumulative sind genau dieselben. - Das ist ein Fehler, nicht wahr? – PhilS

+0

Vermissen Sie eine zusätzliche JOIN-Bedingung für eine ItemId oder etwas Ähnliches? Die Abfrage, so wie sie ist, wird eine große Menge an Ausgabe erzeugen und, abhängig von dem Datenvolumen in den Tabellen, für einige Zeit laufen. – PhilS

Antwort

1

in SQL-Server 2012 können Sie

.... 
SUM(a.[GrossWeightKg] - a.[QtyLeftKg]) OVER(ORDER BY ActualItemUsageSourceId ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 
.... 

ohne Selbst verbinden verwenden. Schauen Sie sich die OVER-clause vor allem den Teil mit der Rows -Klausel an.