열의 각 고유 값에 대해 첫 번째 행만 선택하는 방법
고객 주소 테이블이 있다고 가정 해 보겠습니다.
CName | AddressLine
-------------------------------
John Smith | 123 Nowheresville
Jane Doe | 456 Evergreen Terrace
John Smith | 999 Somewhereelse
Joe Bloggs | 1 Second Ave
표에서 John Smith와 같은 한 고객은 여러 주소를 가질 수 있습니다. 'CName'에 중복 항목이있는 첫 번째 행만 반환하려면이 테이블에 대한 선택 쿼리가 필요합니다. 이 테이블의 경우 세 번째를 제외한 모든 행을 반환해야합니다 (또는 첫 번째-두 주소 중 하나라도 괜찮지 만 하나만 반환 될 수 있음). 서버가 이전에 열 값을 본 적이 있는지 여부를 기준으로 필터링하기 위해 SELECT 쿼리에 추가 할 수있는 키워드가 있습니까?
어떤 주소가 사용되는지 신경 쓰지 않는다고 말하는 경우 매우 간단한 대답입니다.
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
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
row_number()
행의 행 번호를 가져 오는 데 사용할 수 있습니다 . over
명령을 사용합니다. 이 partition by
절은 번호 매기기를 다시 시작할시기를 지정 order by
하고 행 번호를 정렬 할 항목을 선택합니다. order by
쿼리 끝에 를 추가하더라도 over
번호를 매길 때 명령 의 순서가 유지 됩니다.
select *
from mytable
where row_number() over(partition by Name order by AddressLine) = 1
다음 row_numer() over(partition by ...)
과 같은 구문을 사용할 수 있습니다 .
select * from
(
select *
, ROW_NUMBER() OVER(PARTITION BY CName ORDER BY AddressLine) AS row
from myTable
) as a
where row = 1
이것이 row
하는 일은 동일한 것을 볼 때마다 증가하는 카운터 인 라는 열을 생성하고 CName
해당 항목을 기준으로 인덱싱한다는 것 AddressLine
입니다. 부과함으로써 where row = 1
, 하나는 선택할 수있는 CName
그의 AddressLine
첫번째 알파벳 순으로 온다. (가) 경우 order by
했다 desc
, 다음은 선택 것이다 CName
그의 AddressLine
마지막 순으로 온다.
This will give you one row of each duplicate row. It will also give you the bit-type columns, and it works at least in MS Sql Server.
(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
If you want to find all the duplicates instead, just change the rn= 1 to rn > 1. Hope this helps
'program story' 카테고리의 다른 글
엔터프라이즈 iOS 애플리케이션을 설치할 때 "신뢰할 수없는 앱 개발자"메시지 (0) | 2020.10.06 |
---|---|
2.3에서 Done SoftInput 작업 레이블이있는 여러 줄 EditText (0) | 2020.10.06 |
std :: string의 마지막 요소 가져 오기 (0) | 2020.10.05 |
여러 DOS 명령을 병렬로 실행하는 방법은 무엇입니까? (0) | 2020.10.05 |
문자열의 문자가 문자인지 확인하는 방법은 무엇입니까? (0) | 2020.10.05 |