ฉันมีคำถามง่าย ๆ :
ฉันมีpostgresql
ฐานข้อมูล: Scores(score integer)
.
ฉันจะได้คะแนนสูงสุด 10 คะแนนเร็วที่สุดได้อย่างไร
UPDATE:
ฉันจะทำแบบสอบถามนี้หลายครั้งและฉันกำลังมองหาวิธีที่เร็วที่สุด
ฉันมีคำถามง่าย ๆ :
ฉันมีpostgresql
ฐานข้อมูล: Scores(score integer)
.
ฉันจะได้คะแนนสูงสุด 10 คะแนนเร็วที่สุดได้อย่างไร
UPDATE:
ฉันจะทำแบบสอบถามนี้หลายครั้งและฉันกำลังมองหาวิธีที่เร็วที่สุด
คำตอบ:
สำหรับสิ่งนี้คุณสามารถใช้วงเงิน
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
fetch first X rows only
คือคำตอบที่ฉันต้องการ - ขอบคุณจากอนาคตอันไกล!
ดูเหมือนว่าคุณกำลังมองหาORDER BY
ในDESC
ลำดับสุดท้ายที่มีคำสั่งLIMIT :
SELECT
*
FROM
scores
ORDER BY score DESC
LIMIT 10
แน่นอนSELECT *
อาจส่งผลกระทบต่อประสิทธิภาพการทำงานอย่างจริงจังดังนั้นใช้ด้วยความระมัดระวัง
โปรดทราบว่าหากมีความสัมพันธ์ในค่า 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
(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)
explain analyze
?