2011-04-20 32 views
11

Tôi muốn truy vấn cơ sở dữ liệu bằng sql để hiển thị sự khác biệt về thời gian giữa id 1,2,3 và cứ tiếp tục như vậy. về cơ bản nó sẽ so sánh hàng bên dưới nó cho tất cả các bản ghi. Bất kỳ trợ giúp sẽ được đánh giá cao.SQL Datediff - tìm dateiff giữa các hàng

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 

Cảm ơn!

+0

Bạn đang sử dụng RDBMS nào? – AdaTheDev

+0

Xin lỗi, Microsoft SQL Server quản lý Studio – Tyrone2011

Trả lời

6

Giải pháp ANSI SQL tiêu chuẩn. Nên làm việc trong PostgreSQL, Oracle, DB2 và 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 - Có chức năng nào khác ngoài độ trễ mà tôi có thể sử dụng không? – Tyrone2011

+0

Đó là người duy nhất tôi biết cho phép truy cập vào giá trị của hàng "trước đó". –

+1

'lag' không phải là tên hàm được tích hợp sẵn. – Tyrone2011

21

Nếu sử dụng SQL Server, một cách là phải làm:

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 

Một cách khác là sử dụng một CTE và ROW_NUMBER(), như thế này:

;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

Tôi thích câu hỏi đầu tiên, nó giúp tôi tiết kiệm rất nhiều rắc rối, nhưng kinh nghiệm của tôi với CTE là không tốt. Với các bảng lớn, chúng quá nhiều tài nguyên bị tấn công trên cơ sở dữ liệu. –

Các vấn đề liên quan