2014-07-11 35 views
5

Đây là cấu trúc bảng của tôi:SQL: Lọc hàng với tối đa giá trị

File | Version  | Function 
1  | 1   | 1 
1  | 2   | 1 
1  | 3   | 1 
1  | 2   | 2 

2  | 1   | 4 
3  | 2   | 5 

tôi cần nó để trở lại những hàng chỉ

1  | 3   | 1 
2  | 1   | 4 
3  | 2   | 5 

Có nghĩa là tôi chỉ muốn các chức năng mà có phiên bản mới nhất cho mỗi tệp.

Tôi không muốn kết quả dưới đây, tức là id chức năng độc đáo mà không phải là phiên bản mới nhất

1  | 3   | 1 
1  | 2   | 2 
... 

Tôi đã nhìn How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?, nhưng điều đó sẽ trả về id chức năng độc đáo gần đây nhất.

Truy vấn cần tương thích với sqlite3.

Trả lời

3

Một cách hiệu quả để làm điều này là thường sử dụng not exists:

select t.* 
from table t 
where not exists (select 1 
        from table t2 
        where t2.file = t.file and t2.Version > t.version 
       ); 

Truy vấn này có thể tận dụng một chỉ mục trên table(file, version).

Cụm từ này lặp lại truy vấn là: "Cho tôi tất cả các hàng từ bảng trong đó tệp tương ứng không có phiên bản lớn hơn".

+0

Làm việc prefectly, cảm ơn bạn. Có thể bạn có thể nhìn vào câu hỏi tiếp theo của tôi kể từ khi bạn giải quyết 1/4 của một trong những? http://stackoverflow.com/questions/24719716/sql-complex-sum-from-multiple-tables –

1

Lưu ý rằng điều này sẽ trả lại nhiều hàng cho mỗi tệp nếu phiên bản mới nhất cho một tệp tồn tại cho các chức năng khác nhau. ví dụ: nếu ví dụ của bạn ở trên có một hàng bổ sung (1,3,2), giá trị này sẽ trả về 2 hàng cho tệp 1.

select 
    t1.file, 
    t1.version, 
    t1.function 
from 
    mytable t1 
join (
    select 
     t2.file, 
     max(t2.version) max_version   
    from mytable t2 
    group by t2.file 
) t3 join t1.file = t3.file and t1.version = t3.max_version 
2

Trong SQLite 3.7.11 hoặc mới hơn, khi bạn sử dụng MAX, các giá trị khác được đảm bảo đến từ hàng với giá trị lớn nhất:

SELECT File, 
     MAX(Version) AS Version, 
     Function 
FROM MyTable 
GROUP BY File 
Các vấn đề liên quan