2013-08-20 12 views
4

Ребята, у меня есть таблица со столбцом с именем time. Он фиксирует время записи каждой записи в базу данных. Я хочу запросить и вернуть другой столбец, отображающий продолжительность между одной записью и записью перед ней. Например, если я храню запись для Джона сегодня в 12:00, а затем Али в 13:10, я хочу еще один столбец, который будет показывать 01:10:00 (т. Е. HH: MM: SS).Расчет времени между записями в sql

Я понимаю, что могу запросить каждый номер столбца следующим образом.

SELECT ROW_NUMBER() OVER (ORDER BY [followuptime]) from [dbo].[FollowUp] . 

я хотел запросить максимальное число строк AS следующим образом, но это не удается, и возвращаемая ошибка «оконная ....»

SELECT MAX(ROW_NUMBER() OVER (ORDER BY [followuptime])) from [dbo].[FollowUp] . 

Я хотел использовать DATEDIFF(interval,start_time,end_time); функции SQL, но как это сейчас, я застрял. Пожалуйста, оцените вашу помощь или любую другую альтернативу.

+0

Что версию SQL-Server вы используете? 2012 поддерживает это [LAG] (http://technet.microsoft.com/en-us/library/hh231256.aspx) и [LEAD] (http://technet.microsoft.com/en-us/library/hh213125. aspx), что сделало бы это очень легким для получения предыдущего времени. -> 'LAG (followuptime') OVER (ORDER BY followuptime)' – GarethD

+0

Также, если вы делаете 'MAX (ROW_NUMBER() ...' без PARTITION BY, максимальное количество строк будет таким же, как 'COUNT (*)'. Поэтому для вашего второго запроса, который терпит неудачу: 'SELECT MAX (ROW_NUMBER() OVER (ORDER BY [followuptime])) из [dbo]. [FollowUp]', вы можете получить тот же результат с помощью -> 'SELECT COUNT (*) FROM dbo.Followup' – GarethD

+0

SQL-сервер 2012 и студийная версия 11.0.2100.60. Но его высказывание LAG не является встроенной функцией .... –

ответ

2

Поскольку SQL-Server 2008R2 не поддерживает LAG/LEAD вам нужно будет сделать автообъединение с помощью row_number, чтобы получить время из предыдущей строки:

WITH OrderedResults AS 
( SELECT [id], 
      [followuptime], 
      [remark], 
      RowNumber = ROW_NUMBER() OVER (ORDER BY [followuptime]) 
    FROM [dbo].[FollowUp] 
) 
SELECT a.ID, 
     a.FollowUpTime, 
     a.Remark, 
     PreviousTime = b.FollowUpTime, 
     MinutesDifference = DATEDIFF(MINUTE, b.FollowUpTime, a.FollowUpTime) 
FROM OrderedResults a 
     LEFT JOIN OrderedResults b 
      ON b.RowNumber = a.RowNumber - 1 
ORDER BY a.FollowUpTime; 

Example on SQL Fiddle

+0

Спасибо GarethD. –

0

Вы не можете применять MAX к ROW_NUMBER. Используйте CTE и запросите это.

;WITH MyCTE AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY [followuptime]) AS RowNum 
    FROM [dbo].[FollowUp] 
) 

SELECT MAX(RowNum) 
FROM MyCTE 
Смежные вопросы