472 Stimmen

Wie erhält man die 10 wichtigsten Werte in Postgresql?

Ich habe eine einfache Frage:

Ich habe eine postgresql Tisch: Scores(score integer) .

Wie bekomme ich am schnellsten die 10 höchsten Punktzahlen?

UPDATE:

Ich werde diese Abfrage mehrmals durchführen und strebe die schnellste Lösung an.

693voto

Olaf Dietsche Punkte 68937

Hierfür können Sie verwenden Grenze

select *
from scores
order by score desc
limit 10

Wenn Leistung wichtig ist (wann ist sie es nicht ;-), suchen Sie nach einem Index für die Punktzahl.


Ab Version 8.4 können Sie auch den Standard ( SQL:2008 ) fetch first

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

Wie @Raphvanns anmerkte, erhalten Sie damit die first 10 rows buchstäblich. Um doppelte Werte zu entfernen, müssen Sie Folgendes auswählen distinct Zeilen, z.B.

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

SQL-Gefiedel

45voto

Grzegorz Gierlik Punkte 10792

Sie scheinen zu suchen ORDER BY in DESC Bestellung beenden mit LIMIT Klausel:

SELECT
 *
FROM
  scores
ORDER BY score DESC
LIMIT 10

Natürlich SELECT * kann die Leistung ernsthaft beeinträchtigen, daher ist sie mit Vorsicht zu verwenden.

15voto

Raphvanns Punkte 1419

Beachten Sie, dass Sie bei Gleichheit der Top-10-Werte nur die Top-10-Zeilen erhalten, nicht die Top-10 Werte mit den gegebenen Antworten. Beispiel: Wenn die 5 wichtigsten Werte 10, 11, 12, 13, 14, 15 sind, Ihre Daten aber folgende Werte enthalten 10, 10, 11, 12, 13, 14, 15 enthalten, erhalten Sie nur 10, 10, 11, 12, 13, 14 als Top 5 mit einer LIMIT

Hier ist eine Lösung, die mehr als 10 Zeilen zurückgibt, wenn es Gleichstände gibt, aber Sie erhalten alle Zeilen, in denen some_value_column ist technisch gesehen in den Top 10.

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

4voto

Syed Kashif Punkte 412
(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)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X