【发布时间】:2011-02-26 22:55:38
【问题描述】:
我们有许多机器会不定期地将数据记录到数据库中。对于每条记录,我想获取 this 记录和 previous 记录之间的时间段。
我可以使用 ROW_NUMBER 执行此操作,如下所示:
WITH TempTable AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY Machine_ID ORDER BY Date_Time) AS Ordering
FROM dbo.DataTable
)
SELECT [Current].*, Previous.Date_Time AS PreviousDateTime
FROM TempTable AS [Current]
INNER JOIN TempTable AS Previous
ON [Current].Machine_ID = Previous.Machine_ID
AND Previous.Ordering = [Current].Ordering + 1
问题是,它真的很慢(在大约 10k 条目的表上几分钟)-我尝试在 Machine_ID 和 Date_Time 上创建单独的索引,以及单个连接索引,但没有任何帮助.
有没有办法重写这个查询以加快速度?
【问题讨论】:
标签: sql-server sql-server-2005 tsql optimization query-optimization