테이블에서 두 번째로 높은 값 얻기


14
id value
1   50
2   60
3   55

select max(value) from tablename;

일반적으로 우리는 60을 얻을 것이지만 다음 값 55가 필요하다는 것을 알고 있습니다.

SQL을 사용하여 55의 값을 얻으려면 어떻게해야합니까?

답변:


24

가장 높은 값이 한 번만 발생한다고 가정하면 다른 방법 OFFSET(SQL Server 2012 이상) 을 사용하는 것입니다 .

SELECT * 
FROM tablename
ORDER BY column DESC 
OFFSET 1 ROW 
FETCH NEXT 1 ROW ONLY;

23

표에서 두 번째로 높은 고유 값 을 얻으려면 다음을 사용할 수 있습니다.

SELECT MIN(value)
FROM   (SELECT DISTINCT TOP (2) value
        FROM   tablename
        ORDER  BY value DESC)T
/*If only one distinct value return nothing. */
HAVING MIN(value) <> MAX(value);

13

일반적인 솔루션은 다음과 같습니다.

;WITH CTE AS
(
    SELECT
        Col1
        , Col2
        , <AnyColumns>
        , ROW_NUMBER() OVER (ORDER BY <AnyColumns>) AS RowNum
    FROM <YourTable>
    WHERE <YourCondition>
)
SELECT *
FROM CTE
WHERE RowNum = 2 -- Or any condition which satisfies your problem

여기서와 같이 범위를 정의 할 수도 있습니다 RowNum >= 10 AND RowNum <= 20. 그리고 필요한 모든 열이있는 10 ~ 20 번째 행을 제공합니다.


7

다음과 같은 일반적인 최고 트릭이 있습니다.

select top 1 *
from (
    select top 2 *
    from my_table
    order by value desc
    ) t 
order by value asc 

또는 다음과 같이 CTE를 사용할 수도 있습니다.

with CTE as
(
select value, ROW_NUMBER() over(order by value desc) as ord_id
from my_table
)
select value
from CTE
where ord_id = 2

또는 최신 버전의 SQLServer (> = 2012)를 사용하는 경우 지연 기능이 있습니다.

SELECT  top 1  lag(value, 1,0) OVER (ORDER BY value)  
FROM my_table
order by value desc

5

나는 이렇게 할 것입니다 :

SELECT MAX(value)
FROM tablename
WHERE value < (SELECT MAX(value)
               FROM tablename)

1

ROW_NUMBER()윈도우 기능도 사용할 수 있습니다 . 목표 값으로 주문할 때 두 번째 항목을 얻으려면 다음을 수행하십시오.

SELECT value 
FROM (
    SELECT 
        ROW_NUMBER() OVER (PARTITION BY NULL ORDER BY value DESC) as RN,
        value
    FROM my_table
) d
WHERE RN = 2

이제 두 번째로 높은 값을 얻으려고하고 중복 된 값이있는 경우 고유 한 값만 가져 오도록 값 항목별로 그룹화 할 수 있습니다.

SELECT value 
FROM (
    SELECT 
        ROW_NUMBER() OVER (PARTITION BY NULL ORDER BY value DESC) as RN,
        value
    FROM my_table
    GROUP BY value
) d
WHERE RN = 2

MIN(id)두 번째로 높은 값을 가진 첫 번째 레코드의 ID를 알아야하는 경우이 선택 방법을 내부 선택 에 포함하도록이 방법을 수정할 수 있어야합니다 (두 개의 60 및 55로 데이터 세트가 있다고 가정).


5
두 번째로 높은 들어 그냥 교체하는 것이 더 쉽습니다 ROW_NUMBER()와 함께 DENSE_RANK()- 당신은 또한 무료로 다른 모든 열을 얻을. 사용할 필요가 없습니다 GROUP BY.
ypercubeᵀᴹ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.