어떻게 정의합니까 이름이입니까?
이름에 max()
을 사용하면 이름이 서로 다른 결과를 쉽게 반환 할 수 있습니다. 'Aaron Bertrand'와 'Itzik Ben-Gan'은 'Itzik Bertrand'를 반환합니다. Salutation
을 섞은 경우 항상 '부인'을 얻을 수 있습니다. 'Mr.' '부인' 그것은 적절하지 않을지도 모른다.
top with ties
및 row_number()
사용 :
select top 1 with ties
Salutation
, FirstName
, LastName
, EmailAddress
from contact
where EmailAddress <> ''
order by row_number() over (
partition by EmailAddress
order by FirstName /* your 'top' criteria here, FirstName is a placeholder */
);
cross apply()
버전 :
;with cte as (
select *
, rn = row_number() over (
partition by EmailAddress
order by FirstName
)
from contact
where EmailAddress <> ''
)
select
Salutation
, FirstName
, LastName
, EmailAddress
from cte
where rn = 1;
:
select distinct
x.Salutation
, x.FirstName
, x.LastName
, t.EmailAddress
from contact t
cross apply (
select top 1
i.Salutation
, i.FirstName
, i.LastName
from t as i
where i.EmailAddress = t.EmailAddress
order by i.FirstName
) as x
where t.EmailAddress <> ''
common table expression 버전과 row_number()
내가 공통 테이블 표현식을 사용하여 선호하지만, 그 안에 쿼리가 from
절에서와 마찬가지로 잘 작동 : 하위 쿼리 버전
row_number()
:
select
Salutation
, FirstName
, LastName
, EmailAddress
from (
select *
, rn = row_number() over (
partition by EmailAddress
order by FirstName
)
from contact
where EmailAddress <> ''
) s
where rn = 1;
당신은 어떻게 정의합니까 ** 정상 ** 이름을? – SqlZim
중복 된 이름 전체에 대해'max()'를 사용하면 이름이 다른 레코드를 얻을 수 있습니다. 예 : 'Aaron Bertrand'와 'Itzik Ben-Gan'이 당신에게 'Itzik Bertrand'를 줄 것입니다. 혼합 된 인사말을 가지고 있다면 항상 '부인'을 얻을 것입니다. 'Mr.' 및 '부인'. – SqlZim