วิธีรับค่า 10 อันดับแรกใน postgresql


256

ฉันมีคำถามง่าย ๆ :

ฉันมีpostgresqlฐานข้อมูล: Scores(score integer).

ฉันจะได้คะแนนสูงสุด 10 คะแนนเร็วที่สุดได้อย่างไร

UPDATE:

ฉันจะทำแบบสอบถามนี้หลายครั้งและฉันกำลังมองหาวิธีที่เร็วที่สุด


6
-1: คุณทำอะไรไปแล้ว ทำไมถึงไม่ดีพอ รุ่น Postgres คืออะไร อยู่ที่ไหนexplain analyze?
MYS

คำตอบ:


372

สำหรับสิ่งนี้คุณสามารถใช้วงเงิน

select *
from scores
order by score desc
limit 10

หากประสิทธิภาพเป็นสิ่งสำคัญ (เมื่อไม่ได้ ;-) ให้มองหาดัชนีคะแนน


เริ่มต้นด้วยรุ่น 8.4 คุณยังสามารถใช้มาตรฐาน ( SQL: 2008 )fetch first

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

ตามที่ @Raphvanns ชี้ให้เห็นสิ่งนี้จะทำให้คุณได้อย่างfirst 10 rowsแท้จริง ในการลบค่าที่ซ้ำกันคุณต้องเลือกdistinctแถวเช่น

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

ซอ Fiddle


2
fetch first X rows onlyคือคำตอบที่ฉันต้องการ - ขอบคุณจากอนาคตอันไกล!
Mass Dot Net

35

ดูเหมือนว่าคุณกำลังมองหาORDER BYในDESCลำดับสุดท้ายที่มีคำสั่งLIMIT :

SELECT
 *
FROM
  scores
ORDER BY score DESC
LIMIT 10

แน่นอนSELECT *อาจส่งผลกระทบต่อประสิทธิภาพการทำงานอย่างจริงจังดังนั้นใช้ด้วยความระมัดระวัง


3

โปรดทราบว่าหากมีความสัมพันธ์ในค่า 10 อันดับแรกคุณจะได้รับ 10 แถวสูงสุดเท่านั้นไม่ใช่ค่า 10 อันดับแรกมีคำตอบให้ ตัวอย่าง: หากค่า 5 อันดับแรกคือ 10, 11, 12, 13, 14, 15 แต่ข้อมูลของคุณมี 10, 10, 11, 12, 13, 14, 15, 15 คุณจะได้รับ 10, 10, 11, 12, 13 14 เป็น 5 อันดับแรกของคุณด้วยLIMIT

นี่คือวิธีแก้ปัญหาซึ่งจะส่งคืนมากกว่า 10 แถวหากมีความสัมพันธ์ แต่คุณจะได้รับแถวทั้งหมดที่some_value_columnอยู่ใน 10 อันดับแรกทางเทคนิค

select
  *
from
  (select
     *,
     rank() over (order by some_value_column desc) as my_rank
  from mytable) subquery
where my_rank <= 10

จากคำถามของเขามีเพียงหนึ่งคอลัมน์ในตาราง เหตุใดจึงไม่ "เลือกคะแนนที่แตกต่างจากคะแนนเรียงตามคะแนนสูงสุดขีด จำกัด 10"
Derek

@ ดีเร็กจุดดี แม้ว่ามันอาจจะไม่ใช่กรณีในแอปในโลกแห่งความจริงที่เรามักจะมองหาตัวเลือก N อันดับแรกของ "somethings"
Raphvanns

จริง เพียงแค่มุ่งเน้นไปที่คำถามที่แน่นอนของเขา นอกจากนี้ฉันโชคดีที่ใช้การ จำกัด ในข้อความค้นหาย่อยเช่นคุณเช่น "select * จากตารางที่มีค่าใน (เลือกค่าที่แตกต่างจากคำสั่งของตารางตามค่าจากมากไปน้อย 10)" ฉันคิดว่ามันเทียบเท่ากับคุณ ฉันไม่แน่ใจว่าข้อความค้นหาของเราจะทำงานได้ดีขึ้นมันอาจขึ้นอยู่กับโครงสร้างตารางและการจัดทำดัชนี
ดีเร็ก

ไม่มีคำหลักที่ขาดหายไปหลังจากอันดับ ()
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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.