[sql] 두 번째로 큰 값을 찾는 가장 간단한 SQL 쿼리는 무엇입니까?

특정 열에서 두 번째로 큰 정수 값을 찾는 가장 간단한 SQL 쿼리는 무엇입니까?

열에 중복 값이있을 수 있습니다.



답변

SELECT MAX( col )
  FROM table
 WHERE col < ( SELECT MAX( col )
                 FROM table )


답변

SELECT MAX(col) FROM table WHERE col NOT IN (SELECT MAX(col) FROM table);


답변

T-Sql에는 두 가지 방법이 있습니다.

--filter out the max
select max( col )
from [table]
where col < (
    select max( col )
    from [table] )

--sort top two then bottom one
select top 1 col
from (
    select top 2 col
    from [table]
    order by col) topTwo
order by col desc 

Microsoft SQL에서 첫 번째 방법은 해당 열이 클러스터되어 있어도 두 번째 방법보다 두 배 빠릅니다.

정렬 작업이 테이블 또는 인덱스 스캔에 비해 상대적으로 느리기 때문입니다. max 입니다.

또는 Microsoft SQL 2005 이상에서 다음 ROW_NUMBER()기능을 사용할 수 있습니다 .

select col
from (
    select ROW_NUMBER() over (order by col asc) as 'rowNum', col
    from [table] ) withRowNum
where rowNum = 2


답변

여기에 일부 SQL Server 및 MySQL 고유 솔루션이 모두 있으므로 필요한 데이터베이스를 명확히하고 싶을 수도 있습니다. 내가 추측해야한다면 SQL Server는 MySQL에서 사소하기 때문에 말할 것입니다.

또한 중복 가능성을 고려하지 않아 작동하지 않는 일부 솔루션을 보았으므로 어떤 솔루션을 수락할지주의하십시오. 마지막으로, 몇 가지 작동하지만 테이블을 두 번 완전히 스캔하는 것을 볼 수 있습니다. 두 번째 스캔이 2 개의 값만보고 있는지 확인하려고합니다.

SQL Server (2012 이전) :

SELECT MIN([column]) AS [column]
FROM (
    SELECT TOP 2 [column]
    FROM [Table]
    GROUP BY [column]
    ORDER BY [column] DESC
) a

MySQL :

SELECT `column`
FROM `table`
GROUP BY `column`
ORDER BY `column` DESC
LIMIT 1,1

최신 정보:

SQL Server 2012는 이제 훨씬 더 깔끔하고 표준적인 OFFSET / FETCH 구문을 지원합니다.

SELECT TOP 2 [column]
FROM [Table]
GROUP BY [column]
ORDER BY [column] DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;


답변

나는 당신이 다음과 같은 것을 할 수 있다고 생각합니다 :

SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT 1 OFFSET 1

또는

SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT (1, 1)

데이터베이스 서버에 따라 힌트 : SQL Server는 LIMIT을 수행하지 않습니다.


답변

가장 쉬운 방법은 응용 프로그램의이 결과 집합에서 두 번째 값을 얻는 것입니다.

SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2

그러나 SQL을 사용하여 두 번째 값을 선택 해야하는 경우 어떻습니까?

SELECT MIN(value) FROM (SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2) AS t


답변

다음 쿼리를 사용하여 두 번째로 큰 열 값을 찾을 수 있습니다.

SELECT *
FROM TableName a
WHERE
  2 = (SELECT count(DISTINCT(b.ColumnName))
       FROM TableName b WHERE
       a.ColumnName <= b.ColumnName);

다음 링크에서 자세한 내용을 확인할 수 있습니다

http://www.abhishekbpatel.com/2012/12/how-to-get-nth-maximum-and-minimun.html