Generieren Sie eine Zeile pro Minute des Tages aus einer dünn besetzten Datenbanktabelle

Ich habe eine Tabelle mit Zeilen mit Zeitstempel, die an (im Wesentlichen) zufälligen Punkten des Tages eingefügt werden.

Ich muss laufende Summen mit 1 Zeile pro Minute generieren (also wird es für einen einzelnen Tag immer genau 24 * 60 Zeilen geben), z.

Date                Quantity    Running Total
2009-10-29 06:30           1                1
2009-10-29 06:31           5                6
2009-10-29 06:32           10              16  
2009-10-29 06:33           11              27   
2009-10-29 06:34           22              49

... ...

Irgendwelche Gedanken darüber, wie man das am besten macht? Eine SQL-Abfrage wäre ideal, aber nicht unbedingt erforderlich. Die Leistung ist ziemlich wichtig (weniger als 5 Sekunden in einer Tabelle mit 500.000 Zeilen, von denen 70.000 für diese Abfrage interessant sind).

Meine endgültige Lösung (mehr oder weniger).

Das eigentliche Szenario war dies. Ich habe zwei Tabellen, von denen eine Orders mit einer 1: n-Beziehung zu einer Fills-Tabelle enthält.

Ich musste den laufenden Durchschnittspreis und die Gesamtsumme für jede Minute am Handelstag anzeigen

DECLARE @StartDate AS DATETIME, @EndDate AS DATETIME
SET @StartDate = '2009-10-28';
SET @EndDate = '2009-10-29';

-- Generate a Temp Table containing all the dates I'm interested in
WITH DateIntervalsCTE AS
(
 SELECT 0 i, @StartDate AS Date
 UNION ALL
 SELECT i + 1, DATEADD(minute, i, @StartDate )
 FROM DateIntervalsCTE 
 WHERE DATEADD(minute, i, @StartDate ) < @EndDate
)
SELECT DISTINCT Date 
INTO #Dates
FROM DateIntervalsCTE
OPTION (MAXRECURSION 32767);

SELECT 
 d.Date
 , mo3.symbol
 , ISNULL(SUM(mf.Quantity),0) AS CumulativeTotal
 , ROUND(ISNULL(SUM(mf.Quantity * mf.Price)/SUM(mf.Quantity),0),4) AS AveragePrice
FROM 
 #Dates AS d
 CROSS JOIN (
    SELECT DISTINCT mo2.Symbol, mo2.OrderID 
    FROM 
     Orders AS mo2 
     INNER JOIN Fills AS mf2 ON mo2.OrderID = mf2.OrderID
    WHERE CONVERT(DATETIME,CONVERT(CHAR(10),mf2.FillDate,101)) = @StartDate
    ) AS mo3
 LEFT JOIN Fills AS mf ON mo3.OrderID = mf.OrderID AND CONVERT(DATETIME,CONVERT(CHAR(16),mf.FillDate,120)) < = d.Date
WHERE
 d.Date >= DATEADD(mi,390, @StartDate) -- 06:30
 AND d.Date <= DATEADD(mi,780, @StartDate) -- 13:00
GROUP BY d.Date, mo3.symbol
ORDER BY mo3.Symbol, d.Date

Ich habe immer noch nicht alle Tests abgeschlossen, aber es sieht so aus, als ob es den Trick macht, danke für die Hilfe!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage