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

StackOverflow https://stackoverflow.com/questions/32100

  •  09-06-2019
  •  | 
  •  

문제

특정 열에서 두 번째로 큰 정수 값을 찾는 가장 간단한 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 특정 솔루션이 모두 표시되므로 필요한 데이터베이스를 명확히 할 수 있습니다. 비록 내가 추측해야한다면 나는 이것이 MySQL에서 사소한 것이기 때문에 SQL Server라고 말할 것입니다.

또한 복제 가능성을 고려하지 않기 때문에 작동하지 않는 일부 솔루션을 볼 수 있습니다. 마지막으로, 나는 몇 가지가 효과가 있지만 테이블을 두 개의 완전한 스캔 할 것입니다. 두 번째 스캔이 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는 이제 훨씬 더 깨끗합니다 (그리고 기준) 오프셋/페치 구문 :

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는 제한되지 않습니다.

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

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

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

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 `Column` FROM `Table` ORDER BY `Column` DESC LIMIT 1,1;
SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )

이 쿼리는 결과에서 최대 급여를 반환합니다.이 결과는 전체 테이블의 최대 급여가 포함되지 않습니다.

내가 아는 오래된 질문이지만 이것은 나에게 더 나은 exec 계획을 주었다.

 SELECT TOP 1 LEAD(MAX (column)) OVER (ORDER BY column desc)
 FROM TABLE 
 GROUP BY column

select * from (select ROW_NUMBER() over (Order by Col_x desc) as Row, Col_1
    from table_1)as table_new tn inner join table_1 t1
    on tn.col_1 = t1.col_1
where row = 2

이 도움이 도움이되기를 바랍니다.

무엇보다도 가장 간단합니다

select sal from salary order by sal desc limit 1 offset 1

이것은 매우 간단한 코드입니다. 다음을 시도해 볼 수 있습니다.

전 :테이블 이름 = 테스트

salary 

1000
1500
1450
7500

두 번째로 큰 값을 얻는 MSSQL 코드

select salary from test order by salary desc offset 1 rows fetch next 1 rows only;

여기서 '오프셋 1 행'은 테이블의 두 번째 행을 의미하고 '다음 1행만 가져오기'는 해당 1행만 표시하는 것을 의미합니다.'다음 1개 행만 가져오기'를 사용하지 않으면 두 번째 행의 모든 ​​행이 표시됩니다.

select min(sal) from emp where sal in 
    (select TOP 2 (sal) from emp order by sal desc)

메모

SAL은 col 이름입니다
EMP는 테이블 이름입니다

톰, 두 개 이상의 값이 반환 될 때 이것이 실패 할 것이라고 믿습니다. select max([COLUMN_NAME]) from [TABLE_NAME] 부분. 즉, 데이터 세트에 2 개 이상의 값이있는 경우.

쿼리를 약간 수정하면 작동합니다.

select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] **IN** 
  ( select max([COLUMN_NAME]) from [TABLE_NAME] )
select max(COL_NAME) from TABLE_NAME where COL_NAME in 
    (select COL_NAME from TABLE_NAME where COL_NAME < (select max(COL_NAME) from TABLE_NAME));

하위 쿼리는 가장 큰 것 이외의 모든 값을 반환합니다. 반환 된 목록에서 최대 값을 선택하십시오.

select col_name
from (
    select dense_rank() over (order by col_name desc) as 'rank', col_name
    from table_name ) withrank 
where rank = 2
SELECT 
    * 
FROM 
    table 
WHERE 
    column < (SELECT max(columnq) FROM table) 
ORDER BY 
    column DESC LIMIT 1

가장 가장 좋은 방법입니다.

SELECT
      Column name
FROM
      Table name 
ORDER BY 
      Column name DESC
LIMIT 1,1
select age from student group by id having age<(select max(age) from student)order by age limit 1

중복 값을 언급했듯이. 그러한 경우 사용할 수 있습니다 별개의 그리고 그룹에 의해 두 번째로 높은 값을 찾기 위해

여기 테이블이 있습니다

샐러리

:

enter image description here

그룹에 의해

SELECT  amount FROM  salary 
GROUP by amount
ORDER BY  amount DESC 
LIMIT 1 , 1

별개의

SELECT DISTINCT amount
FROM  salary 
ORDER BY  amount DESC 
LIMIT 1 , 1

한계의 첫 번째 부분 = 시작 인덱스

한계의 두 번째 부분 = 몇 값

SELECT MAX(sal) FROM emp
WHERE sal NOT IN (SELECT top 3 sal FROM emp order by sal desc )

이것은 EMP 테이블의 세 번째로 높은 SAL을 반환합니다.

MSSQL

SELECT  *
  FROM [Users]
    order by UserId desc OFFSET 1 ROW 
FETCH NEXT 1 ROW ONLY;

MySQL

SELECT  *
  FROM Users
    order by UserId desc LIMIT 1 OFFSET 1

하위 쿼리가 필요하지 않습니다 ... 한 행을 건너 뛰고 주문 후 순서 후 두 번째 행을 선택하십시오.

이 같은? 그래도 테스트하지 않았습니다.

select top 1 x
from (
  select top 2 distinct x 
  from y 
  order by x desc
) z
order by x

보다 SQL 데이터베이스 테이블에서 nth 행을 선택하는 방법은 무엇입니까?.

SYBASE SQL ANLEADERY 지원 :

SELECT TOP 1 START AT 2 value from table ORDER BY value

상관 관계 쿼리 사용 :

Select * from x x1 where 1 = (select count(*) from x where x1.a < a)
select * from emp e where 3>=(select count(distinct salary)
    from emp where s.salary<=salary)

이 쿼리는 최대 3 개의 급여를 선택합니다. 두 EMP가 동일한 급여를 받으면 쿼리에 영향을 미치지 않습니다.

select top 1 MyIntColumn from MyTable
where
 MyIntColumn <> (select top 1 MyIntColumn from MyTable order by MyIntColumn desc)
order by MyIntColumn desc

이것은 MS SQL에서 작동합니다.

select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] < 
 ( select max([COLUMN_NAME]) from [TABLE_NAME] )

쿼리 두 번째로 높은 숫자를 연속으로 찾으십시오.

select Top 1 (salary) from XYZ
where Salary not in (select distinct TOP 1(salary) from XYZ order by Salary desc)
ORDER BY Salary DESC

강조 표시를 변경함으로써 Top 1 에게 TOP 2, 3 또는 4 u는 각각 3, 4, 5 위를 찾을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top