2012-03-14 33 views
8

Vì tôi mới sử dụng MySQL, câu hỏi này có thể là ngớ ngẩn. Làm thế nào tôi có thể tìm thấy sự khác biệt giữa các hàng kế tiếp?
Ví dụ:
Một bảng (tableName = 'Abc') chứa một hàng duy nhất như sau,Truy vấn để tìm sự khác biệt giữa các hàng kế tiếp trong Mysql

|DATA| 
|10 | 
|20 | 
|30 | 
|40 | 
|50 | 

Ở đây tôi muốn nhận được đầu ra như,

|Dif| 
|10 | 
|10 | 
|10 | 
|10 | 

Làm thế nào để tìm thấy sự khác biệt như điều này mà không có bất kỳ chỉ mục (chính hoặc Auto_increment)?

+1

Đó là một cột chứ không phải một hàng và chỉ được đặt ngẫu nhiên. Trừ khi bạn sử dụng mệnh đề ORDER BY trong câu lệnh SQL, MySQL có thể trả về dữ liệu theo thứ tự bất kỳ. –

Trả lời

4

Tốt nhất nên làm điều này bên ngoài DB bằng cách theo dõi hàng trước đó. Dưới đây là một số mã (hy vọng php của tôi là không quá gỉ):

<?php 

$prevNum = 0; 

$db = mysql_connect(...); // fill in connection string 

mysql_select_db("my_db", $db); 

$result = mysql_query("select DATA from Abc order by DATA"); 

while ($row = mysql_fetch_array($result)) { 

    $diff = $row[0] - $prevNum; 

    echo "$diff\n"; 

    $prevNum = $row[0]; 

} 

?> 

Nếu bạn cần phải làm điều đó trong db đối với một số lý do sau đó nó có lẽ là tốt nhất để tạo ra một stored procedure mà sẽ cơ bản làm điều tương tự : khởi tạo biến có giá trị 0, báo cáo sự khác biệt cho mỗi hàng và biến đó, sau đó đặt biến thành giá trị hàng.

Edited để thêm một trật tự quy định tại khoản như ghi nhận của John Pick

9

Một tự tham gia là một trong những cách để so sánh hàng liên tiếp:

SELECT 
    MIN(T2.DATA - T1.DATA) AS Dif 
FROM 
    Abc T1 INNER JOIN Abc T2 on T1.DATA < T2.DATA 
ORDER BY 
    T1.DATA 
+1

'trên T1.DATA

+1

@prajeeshkumar Tham gia sẽ là hình tam giác '(x * x + x)/2' nếu nó không cho' MIN() ', đảm bảo các hàng khớp với 1: 1, ngoại trừ hàng cuối cùng, không khớp bất cứ điều gì. Kết quả là các hàng 'x-1'. –

+2

Điều này dường như chỉ hoạt động với các bộ dữ liệu tăng đơn điệu, phải không? Tôi đã bỏ lỡ một cái gì đó? Khi tôi chạy nó, tôi nhận được hoặc là một singleton (khi không có sự khác biệt giữa các giá trị) hoặc sự khác biệt thời gian không chính xác (khi tập dữ liệu là không đơn điệu). – DrFriedParts

7

Sử dụng người dùng định nghĩa biến:

SET @prevValue:=0; 
SELECT [email protected] AS diff,@prevValue:=value FROM t; 

Bạn sẽ phải loại bỏ hàng đầu tiên cho trường hợp của mình.

Nếu bảng chứa cả valuediff lĩnh vực, bạn có thể thiết lập các lĩnh vực diff với:

SET @prevValue:=0; 
UPDATE t SET diff=IF((@d:[email protected]) AND (@prevValue:=value),@d,@d); 

Sử dụng IF là cách duy nhất tôi có thể tìm đến cả thiết diff cập nhật các @prevValue biến.

+0

câu trả lời awsome ..... tuyệt vời .. – Ajay2707

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