[SQL] 컬럼의 각 고유 값에 대한 첫 번째 행을 선택하는 방법
SQL컬럼의 각 고유 값에 대한 첫 번째 행을 선택하는 방법
의 내가 고객의 주소 테이블이 있다고 가정 해 봅시다 :
CName | AddressLine
-------------------------------
John Smith | 123 Nowheresville
Jane Doe | 456 Evergreen Terrace
John Smith | 999 Somewhereelse
Joe Bloggs | 1 Second Ave
표에서, 존 스미스와 같은 한 고객이 여러 개의 주소를 사용할 수 있습니다. 이 테이블은 첫 번째 행은 'CNAME'에 중복이있는 곳을 발견 반환 할 내가 선택 쿼리가 필요합니다. 이 테이블은 3을 제외한 모든 행을 반환해야합니다 (또는 1 - 두 주소 중 하나를 좋아하지만 단 하나의 반환 할 수 있습니다). 나는 서버가 이미 전에 열 값을 볼 수 있는지 여부에 따라 필터에 SELECT 쿼리에 추가 할 수있는 키워드가 있습니까?
해결법
-
==============================
1.아주 간단한 대답 당신은 당신이 사용하는 주소 상관 없어 말한다면.
아주 간단한 대답 당신은 당신이 사용하는 주소 상관 없어 말한다면.
SELECT CName, MIN(AddressLine) FROM MyTable GROUP BY CName
첫 번째에 따라 원하는 경우 말,에 "삽입"열은 다음 다른 쿼리
SELECT M.CName, M.AddressLine, FROM ( SELECT CName, MIN(Inserted) AS First FROM MyTable GROUP BY CName ) foo JOIN MyTable M ON foo.CName = M.CName AND foo.First = M.Inserted
-
==============================
2.SQL 2K5 +, 당신은 뭔가를 같이 할 수 있습니다 :
SQL 2K5 +, 당신은 뭔가를 같이 할 수 있습니다 :
;with cte as ( select CName, AddressLine, rank() over (partition by CName order by AddressLine) as [r] from MyTable ) select CName, AddressLine from cte where [r] = 1
-
==============================
3.당신은 행의 행 번호를 얻을 수 ROW_NUMBER ()를 사용할 수 있습니다. 그것은 오버 명령을 사용하여 - 절을 지정하여 파티션이 때 번호와에 행 번호를 주문하는 것을 선택하여 순서를 다시 시작합니다. 당신이 당신의 쿼리의 말에 의해 주문을 추가하더라도 번호 때 이상의 명령 순서를 보존하는 것입니다.
당신은 행의 행 번호를 얻을 수 ROW_NUMBER ()를 사용할 수 있습니다. 그것은 오버 명령을 사용하여 - 절을 지정하여 파티션이 때 번호와에 행 번호를 주문하는 것을 선택하여 순서를 다시 시작합니다. 당신이 당신의 쿼리의 말에 의해 주문을 추가하더라도 번호 때 이상의 명령 순서를 보존하는 것입니다.
select * from mytable where row_number() over(partition by Name order by AddressLine) = 1
-
==============================
4.당신은 너무 같은 (기준 ... 파티션) 구문을 통해 ROW_NUMBER ()를 사용할 수 있습니다 :
당신은 너무 같은 (기준 ... 파티션) 구문을 통해 ROW_NUMBER ()를 사용할 수 있습니다 :
select * from ( select * , ROW_NUMBER() OVER(PARTITION BY CName ORDER BY AddressLine) AS row from myTable ) as a where row = 1
이것이 않는 것은 카운터 인 행라는 열을 생성하는 것입니다 그 단위가 동일한 CNAME 및 인덱스 AddressLine에 의해 그 발생을 볼 때마다. 부과함으로써 열 = 1, 하나는 그의 제 AddressLine 알파벳순 오는 CNAME를 선택할 수있는. 순서로는 내림차순 있었다면, 그것은 누구의 AddressLine 마지막 알파벳 오는 CNAME을 선택합니다.
-
==============================
5.이렇게하면 각 중복 행 한 행을 줄 것이다. 그것은 또한 당신에게 비트 유형 열을 줄 것이다, 그리고 MS SQL 서버에 이상에서 작동합니다.
이렇게하면 각 중복 행 한 행을 줄 것이다. 그것은 또한 당신에게 비트 유형 열을 줄 것이다, 그리고 MS SQL 서버에 이상에서 작동합니다.
(select cname, address from ( select cname,address, rn=row_number() over (partition by cname order by cname) from customeraddresses ) x where rn = 1) order by cname
대신 모든 중복을 찾으려면, 단지> 1 RN하는 RN = 1로 변경합니다. 도움이 되었기를 바랍니다
from https://stackoverflow.com/questions/4662464/how-to-select-only-the-first-rows-for-each-unique-value-of-a-column by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 스택 오버플로 관련 질문 알고리즘 (0) | 2020.07.21 |
---|---|
[SQL] 에 의해 그룹을 사용하고 절을 가진 (0) | 2020.07.21 |
[SQL] 롤백 또는 SQL Server에서 트랜잭션을 커밋하는 방법 (0) | 2020.07.21 |
[SQL] 너무 많은 인덱스에는 mysql? (0) | 2020.07.20 |
[SQL] 다 대다 관계 (제품의 변화)의 조합에 대한 SQL 스키마를 설계 (0) | 2020.07.20 |