Tôi có câu hỏi đơn giản:
Tôi có một postgresql
cơ sở dữ liệu:Scores(score integer)
.
Làm thế nào tôi có thể đạt điểm 10 cao nhất nhanh nhất?
CẬP NHẬT:
Tôi sẽ thực hiện truy vấn này nhiều lần và đang hướng tới giải pháp nhanh nhất.
Tôi có câu hỏi đơn giản:
Tôi có một postgresql
cơ sở dữ liệu:Scores(score integer)
.
Làm thế nào tôi có thể đạt điểm 10 cao nhất nhanh nhất?
CẬP NHẬT:
Tôi sẽ thực hiện truy vấn này nhiều lần và đang hướng tới giải pháp nhanh nhất.
Câu trả lời:
Đối với điều này, bạn có thể sử dụng giới hạn
select *
from scores
order by score desc
limit 10
Nếu hiệu suất là quan trọng (khi nào thì không ;-) hãy tìm chỉ số về điểm số.
Bắt đầu với phiên bản 8.4, bạn cũng có thể sử dụng tiêu chuẩn ( SQL: 2008 )fetch first
select *
from scores
order by score desc
fetch first 10 rows only
Như @Raphvanns đã chỉ ra, điều này sẽ cung cấp cho bạn theo first 10 rows
đúng nghĩa đen. Để xóa các giá trị trùng lặp, bạn phải chọn distinct
các hàng, vd
select distinct *
from scores
order by score desc
fetch first 10 rows only
fetch first X rows only
là câu trả lời tôi đang tìm kiếm - cảm ơn bạn từ tương lai xa!
Có vẻ như bạn đang tìm kiếm ORDER BY
theo DESC
thứ tự kết thúc với mệnh đề LIMIT :
SELECT
*
FROM
scores
ORDER BY score DESC
LIMIT 10
Tất nhiên SELECT *
có thể ảnh hưởng nghiêm trọng đến hiệu suất, vì vậy hãy sử dụng nó một cách thận trọng.
Lưu ý rằng nếu có các mối quan hệ trong 10 giá trị hàng đầu, bạn sẽ chỉ nhận được 10 hàng hàng đầu chứ không phải 10 giá trị hàng đầu với các câu trả lời được cung cấp. Ví dụ: nếu 5 giá trị hàng đầu là 10, 11, 12, 13, 14, 15 nhưng dữ liệu của bạn chứa 10, 10, 11, 12, 13, 14, 15, bạn sẽ chỉ nhận được 10, 10, 11, 12, 13, 14 là top 5 của bạn với mộtLIMIT
Đây là một giải pháp sẽ trả về hơn 10 hàng nếu có mối quan hệ nhưng bạn sẽ nhận được tất cả các hàng có some_value_column
kỹ thuật nằm trong top 10.
select
*
from
(select
*,
rank() over (order by some_value_column desc) as my_rank
from mytable) subquery
where my_rank <= 10
explain analyze
?