2011-04-20 8 views
11

Chciałbym zapytać bazy danych za pomocą sql, aby pokazać różnicę w czasie między id 1,2,3 i tak dalej. zasadniczo porówna wiersz poniżej dla wszystkich rekordów. jakakolwiek pomoc byłaby doceniona.SQL Datediff - znajdź datediff między wierszami

IDCODE DATE TIME  DIFFERENCE (MINS) 
1  02/03/2011 08:00  0 
2  02/03/2011 08:10  10 
3  02/03/2011 08:23  13 
4  02/03/2011 08:25  2 
5  02/03/2011 09:25  60 
6  02/03/2011 10:20  55 
7  02/03/2011 10:34  14 

Dzięki!

+0

Z jakiego RDBMS korzystasz? – AdaTheDev

+0

Hi Przepraszamy, Studio zarządzania Microsoft SQL Server Studio – Tyrone2011

Odpowiedz

6

Standardowe rozwiązanie ANSI SQL. Powinny działać w PostgreSQL, Oracle, DB2 i Teradata:

SELECT idcode, 
     date_time, 
     date_time - lag(date_time) over (order by date_time) as difference 
FROM your_table 
+0

Hi a_horse_with_no_name - Czy istnieje inna funkcja niż opóźnienie? – Tyrone2011

+0

Jest to jedyna znana mi funkcja, która umożliwia dostęp do wartości "poprzedniego" wiersza. –

+1

'lag' nie jest rozpoznawaną wbudowaną nazwą funkcji. – Tyrone2011

21

przypadku korzystania z SQL Server, jednym ze sposobów jest do zrobienia:

DECLARE @Data TABLE (IDCode INTEGER PRIMARY KEY, DateVal DATETIME) 
INSERT @Data VALUES (1, '2011-03-02 08:00') 
INSERT @Data VALUES (2, '2011-03-02 08:10') 
INSERT @Data VALUES (3, '2011-03-02 08:23') 
INSERT @Data VALUES (4, '2011-03-02 08:25') 
INSERT @Data VALUES (5, '2011-03-02 09:25') 
INSERT @Data VALUES (6, '2011-03-02 10:20') 
INSERT @Data VALUES (7, '2011-03-02 10:34') 

SELECT t1.IDCode, t1.DateVal, ISNULL(DATEDIFF(mi, x.DateVal, t1.DateVal), 0) AS Mins 
FROM @Data t1 
    OUTER APPLY (
     SELECT TOP 1 DateVal FROM @Data t2 
     WHERE t2.IDCode < t1.IDCode ORDER BY t2.IDCode DESC) x 

Innym sposobem jest użycie CTE i ROW_NUMBER() w następujący sposób:

;WITH CTE AS (SELECT ROW_NUMBER() OVER (ORDER BY IDCode) AS RowNo, IDCode, DateVal FROM @Data) 

SELECT t1.IDCode, t1.DateVal, ISNULL(DATEDIFF(mi, t2.DateVal, t1.DateVal), 0) AS Mins 
FROM CTE t1 
    LEFT JOIN CTE t2 ON t1.RowNo = t2.RowNo + 1 
ORDER BY t1.IDCode 
+0

Podoba mi się pierwsza, zaoszczędziło mi to wiele kłopotów, ale moje doświadczenia z CTE nie są dobre. W przypadku dużych tabel są one zbyt dużym hitem zasobów w bazie danych. –

Powiązane problemy