it-source

서브쿼리를 사용하지 않고 최대 시퀀스를 가진 행만 선택하는 방법

criticalcode 2023. 10. 28. 07:59
반응형

서브쿼리를 사용하지 않고 최대 시퀀스를 가진 행만 선택하는 방법

ID별로 seq가 가장 높은 행만 선택하려고 합니다.

ID  |  Seq   |  Age
-------------------
 A      1       20   
 A      2       30
 B      1       25
 B      2       32
 B      3       44
 B      4       48
 C      1       11

작동하는 것 같습니다.

SELECT ID, Age
FROM Persons a
WHERE Seq = (SELECT MAX(Seq) FROM Persons b WHERE a.ID = b.ID)

하지만 이게 최선의 방법인가요, 유일한 방법인가요?필요 없다면 서브쿼리를 사용하는 것을 좋아하지 않고 당신이 무언가를 사용할 수 있다는 것을 기억하지만 그것이 무엇인지 잊어버립니다.감 잡히는 게 없어요?

SQL-Server( >= 2005) 또는 Oracle(10g?)을 가정하면 다음과 같습니다.

WITH CTE AS
( 
   SELECT
       ROW_NUMBER() OVER (PARTITION BY ID  ORDER BY Seq DESC) AS RN
       , ID, Age
   FROM 
       Persons
)
SELECT ID, Age 
FROM CTE
WHERE RN = 1

ROW_NUMBER 결과 집합의 파티션 내에 있는 행의 순차 개수를 반환합니다.

편집: http://sqlfiddle.com/ #!4/b7e79/2/0과 같은 Oracle에서도 작동합니다.

일반적으로 windowing 또는 ranking 기능을 사용해야 합니다.Rank(),Row_number(),기타.

select *
from
(
    select *, row_number() over (partition by id order by age desc) rn
    from yourtable
) v
where rn = 1

SQL Server 2005+에서 작동합니다. Oracle에서는 필드 이름 대신 명시적으로 지정해야 할 수도 있습니다.*

윈도우 기능을 지원하지 않는 RDBMS를 사용할 경우 다음을 사용할 수 있습니다.

SELECT  Persons.ID, Persons.Age, Persons.Seq
FROM    Persons
        INNER JOIN
        (   SELECT  Persons.ID, MAX(Seq) AS Seq
            FROM    Persons
            GROUP BY Persons.ID
        ) MaxP
            ON MaxP.ID = Persons.ID
            AND MaxP.Seq = Persons.Seq

아직도 서브쿼리를 포함하고 있지만, 서브쿼리 없이는 이런 일을 할 수 있는 방법이 보이지 않고, 왜 그걸 피하고 싶어하는지 이해할 수가 없습니다.

언급URL : https://stackoverflow.com/questions/13153819/how-to-select-only-row-with-max-sequence-without-using-a-subquery

반응형