4

我在 SQL Server 2008 R2 中有一个名为 Event 的表,其中 eventNum 作为主键,日期作为 datetime2(7)。我正在尝试获取表中最后两行的日期并以分钟为单位获取差异。这是我目前拥有的:

Select DATEDIFF(MI, e.date,(Select e2.date from Event e2 where eventNum = (Select MAX(e2.eventNum))))
    From Event e
    Where eventNum = (Select MAX(e.eventNum)-1 from e)

我得到这个错误:

无效的列名“从事件中选择 eventNum,其中 eventNum = 从事件中选择 MAX(eventNum)”。

我已经更改了 100 次,但无法使其正常工作。有什么帮助吗?

4

2 回答 2

6

你可以使用ROW_NUMBER

WITH CTE AS 
(
   SELECT RN = ROW_NUMBER() OVER (ORDER BY eventNum DESC)
        , date
   FROM Event 
)
SELECT Minutes = DATEDIFF(minute, 
           (SELECT date FROM CTE WHERE RN = 2),
           (SELECT date FROM CTE WHERE RN = 1))

小提琴:http ://www.sqlfiddle.com/#!3/3e9c8/17/0

于 2012-11-01T21:42:19.777 回答
3

这不必像蒂姆的回答那样经过表两次。

select datediff(mi, min(x.date), max(x.date))
from (
    select top(2) *
    from Event e
    order by eventNum desc
) x

在此处输入图像描述

假设您总是有 2 条或更多记录,并且时间单调增加,那么上述工作。

  • 如果它只有一条记录,则返回 0(因为 max=min=singular record)。
  • 如果您的时间不是单调增加的,可以对这个查询进行简单的调整

例如

select top(1) datediff(mi, x.date, y.date)
from event x
join event y on y.eventnum < x.eventnum
order by x.eventnum desc, y.eventnum desc
于 2012-11-01T22:06:42.393 回答