반응형
서브쿼리를 사용하지 않고 최대 시퀀스를 가진 행만 선택하는 방법
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
반응형
'it-source' 카테고리의 다른 글
bloginfo('template_url') 또는 echo esc_url( get_template_directory_uri()) 중 템플릿 디렉토리의 URL을 검색하는 더 나은 방법은 무엇입니까? (0) | 2023.10.28 |
---|---|
HTML 텍스트 영역에 줄 바꿈을 추가하는 방법 (0) | 2023.10.28 |
내림차순의 MySQL 제한 (0) | 2023.10.28 |
Javascript/jQuery : 다중 선택에서 값 설정(Selection) (0) | 2023.10.28 |
왼쪽에서 여는 각도 부트스트랩 드롭다운 (0) | 2023.10.28 |