2013-08-08 13 views
5

Chủ đề của câu hỏi không phải là rất giải thích, xin lỗi vì điều đó.Sql để tìm timediff giữa hai hàng dựa trên ID

Vì vậy, câu hỏi theo sau: Tôi có cấu trúc cơ sở dữ liệu như dưới đây, nơi pk là khóa chính, id là cái gì đó là nhiều cho nhiều hàng.

+------+------+---------------------+ 
| pk | id | value    | 
+------+------+---------------------+ 
| 99 | 1 | 2013-08-06 11:10:00 | 
| 100 | 1 | 2013-08-06 11:15:00 | 
| 101 | 1 | 2013-08-06 11:20:00 | 
| 102 | 1 | 2013-08-06 11:25:00 | 
| 103 | 2 | 2013-08-06 15:10:00 | 
| 104 | 2 | 2013-08-06 15:15:00 | 
| 105 | 2 | 2013-08-06 15:20:00 | 
+------+------+---------------------+ 

Điều gì thực sự là cần phải nhận được là, giá trị chênh lệch giữa hai hàng đầu tiên (mà được sắp xếp theo giá trị) cho mỗi nhóm (nơi nhóm là bởi id). Vì vậy, theo cấu trúc trên, chúng tôi cần timediff (value100, value99) [đó là cho id 1 nhóm] và timediff (value104, value103) [đó là cho id 2 nhóm]

tức là chênh lệch giá trị của thời gian đặt hàng theo giá trị cho hai hàng đầu tiên trong mỗi nhóm.

Một cách tôi có thể nghĩ là thực hiện 3 lần tự tham gia (hoặc 3 truy vấn phụ) để tìm số đầu tiên trong 2 người trong số họ và truy vấn thứ ba trừ nó. Bất kỳ đề xuất?

+0

bạn có cần nó trong một lệnh SQL không? bạn có thể (hoặc bạn muốn) sử dụng một thủ tục được lưu trữ? – Barranka

+0

Sẽ yêu giải pháp sql đơn – amitchhajer

+0

Chỉ cần cập nhật ví dụ của tôi .. Vui lòng đánh dấu câu trả lời là giải pháp cho vấn đề của bạn .. nếu có ai phù hợp với – lordkain

Trả lời

0

Trông lạ chút ... Nhưng bạn có thể thử cách này

SET @previous = 0; 
SET @temp = 0; 
SET @tempID = 0; 

Trên bước thể không cần thiết .. Nhưng chỉ để chắc chắn không có gì trục trặc

SELECT pkid, id, diff, valtemp FROM (
SELECT IF(@previousID = id, @temp := @temp + 1, @temp := 1) occ, @previousID := id, 
TIMEDIFF(`value`, @previous) diff, pk, id, `value`, @previous := `value` 
FROM testtable) a WHERE occ = 2 

Demo on sql fiddle

1

hãy thử điều này .. CTE khá mạnh mẽ!

WITH CTE AS (
    SELECT 
    value, pk, id, 
    rnk = ROW_NUMBER() OVER (PARTITION BY id order by id DESC) 
    , rownum = ROW_NUMBER() OVER (ORDER BY id, pk) 
    FROM test 
) 
SELECT 
    curr.rnk, prev.rnk, curr.rownum, prev.rownum, curr.pk, prev.pk, curr.id, prev.id, curr.value, prev.value, curr.value - prev.value 
FROM CTE curr 
INNER JOIN CTE prev on curr.rownum = prev.rownum -1 and curr.id = prev.id 
and curr.rnk <=1 
+0

ví dụ cập nhật cũng tham gia vào id – lordkain

+0

Từ thẻ, tôi hy vọng DB được sử dụng là MySql chứ không phải MSSQL. Và CTE được hỗ trợ cho MSSQL. – Akhil

+0

có mysql, không có cte. Cảm ơn giữa sẽ chắc chắn hữu ích cho một số người khác. – amitchhajer