2016-07-05 2 views
0

테이블에서 n 번째로 높은 값을 찾으려면 아래 쿼리의 논리가 무엇입니까?SQL Server의 테이블에서 n 번째로 높은 값을 찾는 방법

select * 
from tablename as a 
where (n-1) = (select count(distinct(column name) 
       from tablename as b 
       where b.columname > a.columnname) 

예 질의 :

select * 
from tblperson a 
where 3 = (select count(distinct(expenses)) 
      from tblperson b 
      where b.Expenses > a.Expenses) 
+4

당신의 DBMS 무엇 ? –

+0

Microsoft SQL Server를 사용하고 있습니다. – Thulasiram

+0

질문에 적절하게 태그를 답니다. "SQL Server"가 아닌 "구조화 된 쿼리 언어"인 "SQL"이라는 태그를 지정했습니다. –

답변

1

당신은 기능 OFFSET FETCH Clause (SQL Server Compact)를 사용할 수 있습니다

SELECT * 
FROM tablename 
ORDER BY expenses DESC 
OFFSET N - 1 ROWS -- Nth highest (N-1 offset) 
FETCH NEXT 1 ROWS ONLY; 
+0

내 전화에 메신저 때문에 내 간결을 용서하지만이 도움이 될 수 있습니다. 명령문은 순서대로 나열되어 있기 때문에 순서가 지정된 목록을 가져오고 단순히'OFFSET n LIMIT 1 '을 추가하면 순서가 지정된 목록의 n 번째 요소에있는 단일 항목을 반환하므로 원하는 결과를 얻을 수 있습니다. –

+0

OP가 mysql을 사용하는 경우 작동 할 @JakePsimos. 그러나 그들은 분명히 SQL Server를 사용하고 있다고 말했습니다. –

+0

@ JakePsimos, 힌트를 보내 주셔서 감사합니다. 내 대답은 틀렸어. MS SQL의 'OFFSET'내 업데이트를 보아라. –

0

쿼리는 모든 행에 대해 이동과 함께 테이블에 얼마나 많은 고유 값 계산 말한다 내가보고있는 것보다 (특정 열에서) 더 큰 가치. 특정 위치에 떨어지는 사람들 (가능한 동점) 만 유지하십시오. 따라서 4 위는 3 가지 값이 더 높을 것으로 예상됩니다.

이 작업은 상관 하위 쿼리라고하는 내부 쿼리를 통해 수행됩니다. 서버가 실제로 결과를 계산하는보다 효율적인 방법을 가지고있을지라도 함수 호출이있는 루프와 같이 생각할 수 있습니다. 내부 쿼리는 외부 쿼리의 모든 행에 대해 한 번 논리적으로 실행되며 그 내부의 a에 대한 참조는 상수입니다.

이 방법으로 다시 작성하면 이해하는 데 도움이 될 수 있습니다. (그리고 당신은 또한 자체 내부 쿼리를 테스트 할 수 있습니다.) SQL-Server의

select * from 
(
    select 
     a.columnname, 
     (
      select count(distinct columnname) 
      from tablename as b 
      where b.columnname > a.columnname 
     ) as NumRowsGreater 
    from tablename as a 
) as t 
where NumRowsGreater = (n-1) 
+0

여기서 의심 스럽습니다. 하위 쿼리는 where 조건이 만족되는 개수를 반환하지만 "@ (n-1) ="값만 비교하므로 기본 쿼리가 최대 값을 반환하는 방식을 반환합니다. – Thulasiram

+0

@Thulasiram 나는 당신의 혼란을 정확히 지적 할 수 없으므로 더 잘 설명 할 수 있습니다. 상관 관계가 어떻게 작용하는지 이해하지 못한다고 생각하기 때문에 설명을 공부하십시오. – shawnt00

0

는 저장 프로 시저에서이 같은이

select TOP 3 * FROM tblperson order by Expenses DESC 

또는 뭔가를 시도

select TOP @N * FROM tblperson order by Expenses DESC 
+0

N 번째 행만 반환해야합니다. –

관련 문제