Làm thế nào để có được 10 giá trị hàng đầu trong postgresql?


256

Tôi có câu hỏi đơn giản:

Tôi có một postgresqlcơ 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.


6
-1: bạn đã làm gì cho đến nay? Tại sao điều đó không đủ tốt? Phiên bản Postgres là gì? Ở đâu explain analyze?
mys

Câu trả lời:


372

Đố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 distinctcác hàng, vd

select distinct *
from scores
order by score desc
fetch first 10 rows only

Câu đố SQL


2
fetch first X rows onlylà câu trả lời tôi đang tìm kiếm - cảm ơn bạn từ tương lai xa!
Mass Dot Net

36

Có vẻ như bạn đang tìm kiếm ORDER BYtheo DESCthứ 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.


3

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_columnkỹ 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

Từ câu hỏi của anh ta chỉ có một cột trong bảng. Vậy tại sao không "chọn điểm khác biệt từ thứ tự Điểm theo giới hạn điểm 10"?
Derek

@Derek, điểm tốt. Mặc dù đó có lẽ không phải là trường hợp trong một ứng dụng thế giới thực, nơi chúng ta thường tìm cách xác định N hàng đầu của "đôi khi".
Raphvanns

Thật. Chỉ tập trung vào câu hỏi chính xác của mình. Ngoài ra, tôi đã rất may mắn khi sử dụng giới hạn trong truy vấn con như của bạn, ví dụ: "select * từ bảng trong đó giá trị trong (chọn giá trị khác biệt từ thứ tự bảng theo giá trị giới hạn desc 10)" Tôi nghĩ rằng nó tương đương với bạn. Tôi không chắc những truy vấn nào của chúng tôi sẽ hoạt động tốt hơn, nó có thể sẽ phụ thuộc vào cấu trúc bảng và lập chỉ mục.
Derek

Có một từ khóa bị thiếu QUÁ sau khi xếp hạng ()
Tiago Alcobia

2
(SELECT <some columns>
FROM mytable
<maybe some joins here>
WHERE <various conditions>
ORDER BY date DESC
LIMIT 10)

UNION ALL

(SELECT <some columns>
FROM mytable
<maybe some joins here>
WHERE <various conditions>
ORDER BY date ASC    
LIMIT 10)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.