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!