Mam proste pytanie:
Mam postgresql
bazę danych: Scores(score integer)
.
Jak uzyskać najwyższe 10 punktów najszybciej?
AKTUALIZACJA:
Zrobię to zapytanie wiele razy i dążę do najszybszego rozwiązania.
Mam proste pytanie:
Mam postgresql
bazę danych: Scores(score integer)
.
Jak uzyskać najwyższe 10 punktów najszybciej?
AKTUALIZACJA:
Zrobię to zapytanie wiele razy i dążę do najszybszego rozwiązania.
Odpowiedzi:
Do tego możesz użyć limitu
select *
from scores
order by score desc
limit 10
Jeśli wydajność jest ważna (kiedy nie jest ;-) poszukaj indeksu wyniku.
Począwszy od wersji 8.4, możesz także używać standardu ( SQL: 2008 )fetch first
select *
from scores
order by score desc
fetch first 10 rows only
Jak wskazał @Raphvanns, da ci to first 10 rows
dosłownie. Aby usunąć zduplikowane wartości, musisz wybrać distinct
wiersze, np
select distinct *
from scores
order by score desc
fetch first 10 rows only
fetch first X rows only
to odpowiedź, której szukałem - dziękuję z dalekiej przyszłości!
Wygląda na to, że szukasz ORDER BY
w DESC
końcowej kolejności z klauzulą LIMIT :
SELECT
*
FROM
scores
ORDER BY score DESC
LIMIT 10
Oczywiście SELECT *
może to poważnie wpłynąć na wydajność, więc używaj go ostrożnie.
Zauważ, że jeśli w najlepszych 10 wartościach są remisy, otrzymasz tylko 10 najlepszych wierszy, a nie 10 najlepszych wartości z podanymi odpowiedziami. Np .: jeśli 5 najlepszych wartości to 10, 11, 12, 13, 14, 15, ale twoje dane zawierają 10, 10, 11, 12, 13, 14, 15, otrzymasz tylko 10, 10, 11, 12, 13, 14 jako twoja pierwsza piątka zLIMIT
Oto rozwiązanie, które zwróci więcej niż 10 rzędów, jeśli są remisy, ale dostaniesz wszystkie wiersze, które some_value_column
technicznie znajdują się w pierwszej dziesiątce.
select
*
from
(select
*,
rank() over (order by some_value_column desc) as my_rank
from mytable) subquery
where my_rank <= 10
explain analyze
?