我有一个表格,用于跟踪发生在任意时间点的机器维护情况。这里有一个简单的表结构:选择表格中每一行的前一个日期
Maintenance Table
----------------------------------------
ID - integer
DateCompleted - date
MachineName - varchar
和这里的一些示例表数据:
ID DateCompleted MachineName
----------------------------------------
1 1/6/2011 'Machine 1'
2 1/13/2011 'Machine 2'
3 1/14/2011 'Machine 1'
4 2/2/2011 'Machine 3'
5 2/26/2011 'Machine 1'
6 3/9/2011 'Machine 2'
7 4/20/2011 'Machine 3'
我想要做的就是创建一个查询,将返回从以前的维修任务的日期为每个任务。所以结果集是这样的:
ID MachineName CurDate PrevDate
----------------------------------------
1 'Machine 1' 1/6/2011 NULL
2 'Machine 2' 1/13/2011 NULL
3 'Machine 1' 1/14/2011 1/6/2011
4 'Machine 3' 2/2/2011 NULL
5 'Machine 1' 2/26/2011 1/14/2011
6 'Machine 2' 3/9/2011 1/13/2011
7 'Machine 3' 4/20/2011 2/2/2011
什么是最好的方式来写这样的查询?我唯一的想法到目前为止是这样的:
SELECT ID, MachineName, DateCompleted AS CurDate,
(
SELECT TOP 1 DateCompleted FROM Maintenance m2
WHERE m1.MachineName = m2.MachineName
AND m1.DateCompleted > m2.DateCompleted
ORDER BY DateCompleted DESC
) AS PrevDate
FROM Maintenance m1
ORDER BY ID
任何想法,建议或修正将是非常欢迎的。
您使用的是什么RDBMS? – Lamak 2012-01-13 19:39:49
微软,但我欢迎任何解决方案。 – Sparafusile 2012-01-13 19:44:34
“Microsoft”不是RDBMS。 “SQL Server”是一个dbms。我为你加了标签。 – 2012-01-13 20:00:55