Đối với n =2, bạn có thể
SELECT max(column1) m
FROM table t
GROUP BY column2
UNION
SELECT max(column1) m
FROM table t
WHERE column1 NOT IN (SELECT max(column1)
WHERE column2 = t.column2)
đối với bất kỳ cách tiếp cận nào bạn có thể sử dụng được mô tả tại đây để mô phỏng xếp hạng trên phân vùng.
CHỈNH SỬA:Trên thực tế, điều này bài viết sẽ cung cấp cho bạn chính xác những gì bạn cần.
Về cơ bản nó là một cái gì đó như thế này
SELECT t.*
FROM
(SELECT grouper,
(SELECT val
FROM table li
WHERE li.grouper = dlo.grouper
ORDER BY
li.grouper, li.val DESC
LIMIT 2,1) AS mid
FROM
(
SELECT DISTINCT grouper
FROM table
) dlo
) lo, table t
WHERE t.grouper = lo.grouper
AND t.val > lo.mid
Thay thế grouper
với tên của cột bạn muốn nhóm theo và val
với tên của cột chứa các giá trị.
Để tìm ra cách hoạt động chính xác của nó, hãy đi từng bước từ truy vấn bên trong nhất và chạy chúng.
Ngoài ra, có một sự đơn giản hóa nhỏ - truy vấn con tìm mid
có thể trả về NULL nếu danh mục nhất định không có đủ giá trị vì vậy nên có COALESCE của danh mục đó thành một hằng số nào đó sẽ có ý nghĩa khi so sánh (trong trường hợp của bạn, nó sẽ là MIN miền của val, trong bài viết nó là MAX).
EDIT2: Tôi quên đề cập rằng chính LIMIT 2,1 xác định n (LIMIT n, 1).