2012-11-01 60 views
4

我有一個名爲Event,EventNum作爲主鍵,日期爲SQL Server 2008 R2中的datetime2(7)的表。我試圖獲取表格中最後兩行的日期,並以分鐘爲單位獲得差異。這是我目前有:SQL查詢獲取最後兩條記錄的DateDiff

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) 

,我得到這個錯誤:

Invalid column name 'Select eventNum from Event Where eventNum = Select MAX(eventNum) from Event'.

我已經改變了這個100倍,並不能得到它的工作。任何幫助?

回答

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

+0

您可以添加一個「top 1」子句。現在,它重複表 – GolfWolf

+0

@ w0lf中的每一行的結果:或刪除最後一個'FROM CTE' –

+0

@ypercube是的,很好的! http://www.sqlfiddle.com/#!3/3e9c8/5 – GolfWolf

3

這並不一定要經過兩次表像Tim的答案。

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

enter image description here

假設你總是有2條以上的,時間是單調增加,那麼上述作品。

  • 如果它只有一條記錄,它將返回0(因爲max = min =單數記錄)。
  • 如果你的時間不單調遞增,有一個簡單的調整來此查詢

例如

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 
+1

不錯,但'日期'可能與'eventNum'的順序不同。如果日期差異的標誌很重要,這是錯誤的。如果沒有,這是正確的。 –

+0

當OP只需要一個值時,我不確定一毫秒或多或少是否是這個問題的關鍵因素,更重要的是因爲訂單列是主鍵列。 –

相關問題