postgresql에서 상위 10 개 값을 얻는 방법은 무엇입니까?


256

간단한 질문이 있습니다.

나는이 postgresql데이터베이스를 : Scores(score integer).

가장 높은 10 점을 가장 빨리 얻으려면 어떻게해야합니까?

최신 정보:

이 쿼리를 여러 번 수행하고 가장 빠른 솔루션을 목표로하고 있습니다.


6
-1 : 지금까지 무엇을 했습니까? 왜 충분하지 않습니까? Postgres 버전은 무엇입니까? 어디있어 explain analyze?
mys

답변:


372

이를 위해 당신은 한계 를 사용할 수 있습니다

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

SQL 바이올린


2
fetch first X rows only내가 찾던 해답입니다-먼 미래에 감사합니다!
Mass Dot Net

35

LIMIT 절 을 사용 ORDER BY하여 DESC끝 순서로 찾고있는 것 같습니다 .

SELECT
 *
FROM
  scores
ORDER BY score DESC
LIMIT 10

물론 SELECT *성능에 심각한 영향을 줄 수 있으므로주의해서 사용하십시오.


3

상위 10 개 값에 관계가있는 경우 제공된 답변 이 포함 된 상위 10 개 이 아니라 상위 10 개 행만 가져옵니다 . 예 : 상위 5 개 값이 10, 11, 12, 13, 14, 15이지만 데이터에 10, 10, 11, 12, 13, 14, 15가 포함 된 경우 10, 10, 11, 12, 13, 당신의 상위 5로 14LIMIT

다음은 동점이있는 경우 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

그의 질문에서 테이블에는 단 하나의 열만 있습니다. 그렇다면 "점수 desc 한도 10으로 점수 순서와 다른 점수를 선택"하지 않는 이유는 무엇입니까?
Derek

@ 데릭, 좋은 지적. 우리가 일반적으로 "무언가"의 상위 N 개를 식별하려고하는 실제 앱에서는 그렇지 않을 수도 있습니다.
Raphvanns 2019

진실. 그의 정확한 질문에만 집중하십시오. 또한, 나는 당신처럼 하위 쿼리에 제한을 사용하여 좋은 행운, 예를 들면 했어 "테이블에서 선택 * 어디에서 값 (값 내림차순 한계 (10)에 의해 테이블 순서에서 별개의 값을 선택)"내가 생각하는 그 당신에 해당합니다. 어떤 쿼리가 더 잘 수행되는지 잘 모르겠습니다. 테이블 구조와 인덱싱에 달려있을 것입니다.
Derek

rank () 다음에 누락 된 키워드 OVER가 있습니다.
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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.