2010-01-30 49 views
7

Tôi có một bảng như thế này:Làm cách nào để nhóm theo giá trị nhỏ nhất trong một trường của bảng, giữ tất cả các giá trị từ cùng một hàng?

Field1 | Field2 | Field3 
1  | 1  | 22 
1  | 2  | 10 
2  | 5  | 40 
2  | 2  | 55 

Tôi muốn nhóm bởi Field1, và sau đó lấy giá trị từ phần còn lại của hàng với Field2 tối thiểu, ví dụ:

Field1 | Field2 | Field3 
1  | 1  | 22 
2  | 2  | 55 

Lưu ý rằng điều này không giống như chọn mức tối thiểu của mỗi hàng, sẽ cung cấp:

Field1 | Field2 | Field3 
1  | 1  | 10 
2  | 2  | 40 

Dữ liệu của tôi sẽ là kết quả vô nghĩa.

Có ai có giải pháp chung (nghĩa là đa cơ sở dữ liệu) không? Tôi chắc chắn nó phải là một vấn đề được giải quyết!

Tôi thực sự có thể thực hiện với giải pháp hoạt động trong cả sqlite và truy cập ms và máy chủ sql sẽ là tiền thưởng.

Trả lời

12

Bạn sẽ phải thực hiện điều này với truy vấn phụ.

Select * from 
yourtable t 
    inner join 
    ( Select field1, min(field2) as minField2 
     from yourtable 
     group by field1 
    ) xx 
    on t.field1 = xx.field1 and t.field2 = xx.minfield2 

Bây giờ, nếu bạn có nhiều hàng cho giá trị trường 2 tối thiểu, thì bạn sẽ có hai giá trị ... Nếu bạn không muốn điều đó (nghĩa là bạn muốn giá trị tối thiểu của trường 3 cho mọi giá trị tối thiểu của trường2) trong trường hợp đó, bạn cần một truy vấn phụ khác:

Select outert.field1, outert.field2, outert.field3 
from yourtable outert 
inner join 

( 
Select t.field1, xx.minfield2, min(field3) as minfield3 from 
yourtable t 
    inner join 
    ( Select field1, min(field2) as minField2 
     from yourtable 
     group by field1 
    ) xx 
    on t.field1 = xx.field1 and t.field2 = xx.minfield2 
group by t.field1, xx.minfield2 
) outerx 
on outerx.field1 = outert.field1 
and outerx.field2 = outert.minfield2 
and outerx.field3 = outert.minfield3 
+0

Một cảnh báo về điều này, nếu 'xx.field1' và' xx.minfield2' có thể khớp nhiều hơn một hàng trong 'yourtable', ví dụ nếu field1 không phải là giá trị khóa, điều này có thể tạo ra kết quả không mong muốn, nghĩa là nhiều hàng cho mỗi lần xuất hiện của trường1 trong bảng kết nối. Nếu 'field1' và' minfield2' chỉ có thể tạo ra một hàng một cách đáng tin cậy, thì nó hoạt động tốt. Cảm ơn :) – pseudocoder

5

Như bạn có thể thấy có một giải pháp hoạt động chỉ bằng SQL chuẩn, nhưng nó dài và phức tạp.

Lưu ý rằng bạn cũng có thể viết "Hello, world!" chương trình hoạt động chính xác trong ba ngôn ngữ lập trình khác nhau. Làm điều này thường không thêm bất kỳ giá trị nào cho chương trình của bạn. Nó dễ dàng hơn nhiều chỉ để viết chương trình ba lần, phù hợp với cú pháp cụ thể của từng ngôn ngữ. Tôi nghĩ với SQL nó thường là tốt hơn để quên cố gắng tìm một giải pháp mà làm việc trong tất cả các RDBMS và sử dụng các phần mở rộng nhà cung cấp cụ thể và thành ngữ mà làm cho các truy vấn như thế này dễ dàng hơn. Các tính năng: Ví dụ: trong MS SQL Server, bạn có thể làm như sau:

SELECT Field1, Field2, Field3 
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY field1 ORDER BY field2) AS rn 
    FROM table1 
) AS T1 
WHERE rn = 1 

Dù sao, bạn đã có giải pháp chung, vì vậy tôi chỉ nghĩ rằng tôi sẽ cung cấp quan điểm thay thế này.

+0

Tôi hiểu rằng tôi đang tạo một cây gậy để tự quay trở lại với sql, nhưng một khi tôi đã viết nó sau khi nó được thực hiện và có thể được sử dụng ở nhiều nơi khác nhau trong dự án hiện tại của tôi. – mavnn

+1

Ngoài ra, tôi không muốn buộc bản thân mình để truy cập SQL cụ thể (đó là nơi dữ liệu hiện đang) khi tôi đang cố gắng thuyết phục các quyền hạn đó là di chuyển dữ liệu đến sqlite hoặc SQL Server. – mavnn

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