Postgresql'de ilk 10 değeri nasıl alabilirim?


257

Basit bir sorum var:

Bir var postgresqlbir veritabanı: Scores(score integer).

En yüksek 10 puanı en hızlı nasıl alabilirim?

GÜNCELLEME:

Bu sorguyu birden çok kez yapacağım ve en hızlı çözümü hedefliyorum.


6
-1: şu ana kadar ne yaptın? Neden yeterince iyi değil? Postgres sürümü nedir? Nerede explain analyze?
mys

Yanıtlar:


374

Bunun için limit kullanabilirsiniz

select *
from scores
order by score desc
limit 10

Performans önemliyse (ne zaman değildir ;-) puan üzerinde bir dizin arayın.


8.4 sürümünden başlayarak standardı da kullanabilirsiniz ( SQL: 2008 )fetch first

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

@ Raphvanns'ın işaret ettiği gibi, bu size first 10 rowstam anlamıyla verecektir . Yinelenen değerleri kaldırmak için distinctsatır seçmeniz gerekir ; ör.

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

SQL Keman


2
fetch first X rows onlyaradığım cevap - uzak gelecekten teşekkür ederim!
Mass Dot Net

36

Aradığınız görünüyor ORDER BYiçinde DESColan düzeni biten SINIR maddesi:

SELECT
 *
FROM
  scores
ORDER BY score DESC
LIMIT 10

Elbette SELECT *performansı ciddi şekilde etkileyebilir, bu yüzden dikkatli kullanın.


3

Not ilk 10 değerlerinde bağlar varsa, sadece en iyi 10 satır değil, ilk 10 alacak değerlerini sağlanan cevapları ile. Örneğin: ilk 5 değer 10, 11, 12, 13, 14, 15 ise ancak verileriniz 10, 10, 11, 12, 13, 14, 15 içeriyorsa, yalnızca 10, 10, 11, 12, 13, 14 ile ilk 5LIMIT

Bağlar varsa 10'dan fazla satır döndürecek bir çözüm var ama some_value_columnteknik olarak ilk 10'da yer alan tüm satırları alacaksınız .

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

Sorusuna göre tabloda sadece bir sütun var. Öyleyse neden "10 puan limitine göre Skor sırasından farklı bir puan seçmeyin"?
Derek

@Derek, iyi bir nokta. Her ne kadar biz genellikle "bir şeylerin" üst N tanımlamak için arıyoruz gerçek dünya app böyle olmazdı.
Raphvanns

Doğru. Sadece onun tam sorusuna odaklanıyoruz. Ayrıca Seninki gibi bir alt sorguda sınır kullanmayı iyi şans, örneğin yaşadım "tablosundan * seçmek nereye değeri (değer desc sınırı 10 tarafından masa düzeninden ayrı değer seçin)" Ben düşünüyorum o sizinkine eşittir. Hangi sorgularımızın daha iyi performans göstereceğinden emin değilim, muhtemelen tablo yapısına ve dizinlemeye bağlı olacaktır.
Derek

Rank ()
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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.