의가 (필자는 IsNewCustomer 플래그와 함께 주어진 일에 대한 응용 프로그램의 목록을 검색하고 싶은SQL - 가입 같은 테이블
ApplicationId INT,
CustomerId INT,
ApplicationDate DATETIME,
IsNewCustomer BOOL
을 다음과 같이 나는 테이블을 응용 프로그램 있다고 가정 해 봅시다있는 주어진 CustomerID에 대해 응용 프로그램이없는 경우 설정됩니다.
현재 동일한 테이블에서 다음과 같은 조인을 사용하고 있습니다.
select
o.ApplicationId as ApplicationId,
cast(o.ApplicationDate as date) as ApplicationDate,
case when n.ApplicationID is not null then 1 else 0 end as IsNewCustomer,
row_number() over (partition by o.ApplicationId order by o.ApplicationDate desc) as AppSeqNum
from
Applications o
left join Applications n
on n.CustomerId = o.CustomerId
and n.ApplicationDate < o.ApplicationDate
where
AppSeqNum = 1
and ApplicationDate = getdate()
가장 우아한 솔루션과 같은 느낌이 들지 않는 동일한 테이블에 가입하지 않아도 동일한 결과를 얻을 수있는 더 좋은 방법이 있는지 궁금합니다.
감사합니다.
동일한 테이블을 조인하는 대신 subselect를 수행 할 수 있지만 비용이 더 많이들 것입니다. 왜 그것이 옳다고 생각하지 않는지 이해하지 못합니다. 쿼리해야하는 정보가 들어있는 테이블은 응용 프로그램 테이블이므로 쿼리에 대한 문제는 무엇입니까? 또 다른 옵션은 IsNewCustomer를이 테이블의 삽입/업데이트 프로세스의 일부로 업데이트하여 필요할 때 데이터를 준비 할 수 있도록하는 것입니다. – tucaz
아니,이 일을 제대로하고 있습니다. 이것은 자기 조인을 사용할 수있는 적절한 장소입니다. 자기 조인이 당신을 자의식이되게하지 마라! – criticalfix
쿼리를 리버스 엔지니어링하거나 샘플 데이터와 원하는 결과를 보지 않고도 알기는 어렵지만 SQL Server 2012에서는 새 창 기능을 사용하여보다 효율적으로이 작업을 수행 할 수 있습니다. 이전 버전에서는 아마도 이것이 최선의 방법 일 것입니다. 테이블의 행은 몇 개입니까? 고객 당 평균 행 수는 얼마입니까? –