¿Cómo obtener los 10 valores principales en postgresql?


257

Tengo una pregunta simple:

Tengo una postgresqlbase de datos: Scores(score integer).

¿Cómo obtendría los 10 puntajes más altos el más rápido?

ACTUALIZAR:

Haré esta consulta varias veces y apunto por la solución más rápida.


66
-1: ¿qué has hecho hasta ahora? ¿Por qué eso no es lo suficientemente bueno? ¿Cuál es la versión de Postgres? ¿Dónde está explain analyze?
mys

Respuestas:


373

Para esto puedes usar limit

select *
from scores
order by score desc
limit 10

Si el rendimiento es importante (cuando no lo es ;-) busque un índice de puntuación.


A partir de la versión 8.4, también puede usar el estándar ( SQL: 2008 )fetch first

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

Como señaló @Raphvanns, esto te dará first 10 rowsliteralmente. Para eliminar valores duplicados, debe seleccionar distinctfilas, p. Ej.

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

Violín de SQL


2
fetch first X rows onlyes la respuesta que estaba buscando, ¡gracias desde el futuro lejano!
Mass Dot Net

36

Parece que está buscando ORDER BYen DESCorden final con la cláusula LIMIT :

SELECT
 *
FROM
  scores
ORDER BY score DESC
LIMIT 10

Por supuesto, SELECT *podría afectar seriamente el rendimiento, así que úselo con precaución.


3

Tenga en cuenta que si hay vínculos en los 10 valores principales, solo obtendrá las 10 filas superiores, no los 10 valores principales con las respuestas proporcionadas. Ej: si los 5 valores principales son 10, 11, 12, 13, 14, 15 pero sus datos contienen 10, 10, 11, 12, 13, 14, 15, solo obtendrá 10, 10, 11, 12, 13, 14 como tu top 5 con unLIMIT

Aquí hay una solución que devolverá más de 10 filas si hay empates, pero obtendrá todas las filas que some_value_columntécnicamente se encuentran en el top 10.

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

De su pregunta solo hay una columna en la tabla. Entonces, ¿por qué no "seleccionar un puntaje distinto del orden de puntajes por límite de puntaje desc 10"?
Derek

@Derek, buen punto. Aunque eso probablemente no sería el caso en una aplicación del mundo real donde generalmente buscamos identificar el N principal de "algo".
Raphvanns

Cierto. Solo enfocándome en su pregunta exacta. Además, he tenido buena suerte al usar el límite en una subconsulta como la suya, por ejemplo, "seleccione * de la tabla donde está el valor (seleccione un valor distinto del orden de la tabla por el valor desc límite 10)" Creo que es equivalente al suyo. No estoy seguro de cuál de nuestras consultas funcionará mejor, probablemente dependerá de la estructura de la tabla y la indexación.
Derek

Falta una palabra clave OVER después de 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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.