【发布时间】:2009-10-29 17:19:42
【问题描述】:
我有一个表格,其中填充了在一天中(基本上)随机点插入的带有时间戳的行。
我需要以每分钟 1 行的方式生成运行总计(因此一天中总会有 24 * 60 行),例如
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
... ...
对最好的方法有什么想法吗? 一个 SQL 查询将是理想的但不是必需的,性能相当重要(在包含 500k 行的表上不到 5 秒,其中 70k 对此查询感兴趣)
我的最终解决方案(或多或少)。
实际情况是这样的。我有两个表,其中一个包含与 Fills 表具有 1:n 关系的 Orders。
我需要显示交易日每分钟的运行平均价格和累计总价
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
我还没有完成所有的测试,但这看起来可以解决问题,感谢您的帮助!
【问题讨论】:
-
PS:很确定在oreilly.com/catalog/9780596009762 中有解决方案,但我的副本当然是 MIA :(
标签: sql-server-2005