2011-11-18 42 views
7

Tôi cần viết truy vấn chọn giá trị tối thiểu và giá trị nhỏ nhất thứ hai từ danh sách số nguyên.Chọn giá trị nhỏ nhất thứ hai trong Oracle

Nắm lấy giá trị nhỏ nhất là rõ ràng:

select min(value) from table; 

Nhưng nhỏ nhất thứ hai không phải là quá rõ ràng.

Đối với hồ sơ, danh sách các số nguyên không phải là tuần tự - min có thể 1000, và hầu hết những phút giây có thể 10000.

Trả lời

15

Sử dụng một hàm giải tích

SELECT value 
    FROM (SELECT value, 
       dense_rank() over (order by value asc) rnk 
      FROM table) 
WHERE rnk = 2 

Các chức năng phân tích RANK, DENSE_RANK, và ROW_NUMBER là giống hệt nhau ngoại trừ cách họ xử lý các mối quan hệ. RANK sử dụng quy trình thể thao để phá vỡ các mối quan hệ vì vậy nếu hai hàng buộc xếp hạng 1, hàng tiếp theo có thứ hạng là 3. DENSE_RANK cho cả hai hàng được xếp hạng 1 và sau đó gán hàng tiếp theo xếp hạng 2. ROW_NUMBER tùy ý phá vỡ cà vạt và cho một trong hai hàng có giá trị thấp nhất xếp hạng 1 và thứ hạng khác là 2.

+0

+1 Giải pháp tương tự như tôi đã đăng, nhưng với giải thích bổ sung tốt về sự khác biệt giữa ba hàm phân tích tương tự. – GolezTrol

+0

Chức năng phân tích! Tại sao tôi không nghĩ về chúng trước đây. Tôi đánh giá cao sự giúp đỡ và lời giải thích. – ryebr3ad

5
SELECT MIN(value) 
FROM TABLE 
WHERE Value > (SELECT MIN(value) FROM TABLE) 
+0

Lưu ý rằng điều này đòi hỏi phải nhấn hai lần để nó đắt hơn hơn giải pháp chức năng phân tích. Theo văn bản, cũng khó mở rộng khi bạn muốn hàng thứ 3 hoặc thứ 5 hoặc thứ 10. Bạn có thể thực hiện COUNT (*) số hàng trong bảng có giá trị nhỏ hơn hàng hiện tại từ truy vấn bên ngoài dễ mở rộng hơn nhưng hiệu quả kém hơn nhiều. –

+0

@JustinCave - tất cả các điểm hợp lệ – JNK

+0

Tôi upvoted giải pháp của bạn bởi vì nó là thông minh, nhưng tôi sẽ không sử dụng điều đó. – Benoit

7
select 
    value 
from 
    (select 
    value, 
    dense_rank() over (order by value) rank 
    from 
    table) 
where 
    rank = 2 

Ưu điểm: Bạn có thể nhận được giá trị thứ ba dễ dàng, hoặc 10 hàng dưới cùng (xếp hạng < = 10).

Lưu ý rằng hiệu suất của truy vấn này sẽ được hưởng lợi từ chỉ mục phù hợp về 'giá trị'.

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