두 번째로 큰 값을 찾는 가장 간단한 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 특정 솔루션이 모두 표시되므로 필요한 데이터베이스를 명확히 할 수 있습니다. 비록 내가 추측해야한다면 나는 이것이 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
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 위를 찾을 수 있습니다.