2014-11-13 2 views
0

나는이 다음 표공통 테이블 표현식은 선택

위치 테이블

[ID] [int] IDENTITY(1,1) NOT NULL 

패키지 테이블

[ID] [int] IDENTITY(1,1) NOT NULL 

PackageObservation 테이블

[PackageID] int 
[LocationID] int 
[Date] datetime 
[Quantity] int 

주어진 위치에 대해 패키지의 마지막 관찰 지점이있는 패키지를 선택하고자합니다

Transact SQL이란 무엇입니까? 공통 테이블식이 포함되어 있다고 생각하지만 그럴 수는 없습니다.

자세한 정보. 거의 그것을 않습니다,하지만 난 정말

select max(id) ,packageid 
    from packageobservation o1 
    where not exists ( 
    select o2.id from packageobservation o2 
    where o2.[date] > o1.[date]) 
    group by packageid 

답변

1

당신은 SQL 문를 사용할 수 있습니다 신원 필드는 날짜 순서에 있다고 가정하고 싶지 않아 다음 : 당신이 할 수있는 더 나은 속도를 들면

DECLARE @locationID int = 1 

    SELECT po.PackageID, MAX(po.[Date]) AS DateAtLocation 
    FROM PackageObservation po 
    WHERE [email protected] 
    AND NOT EXISTS (SELECT * FROM PackageObservation po2 
        WHERE po2.PackageID = po.PackageID AND 
         po2.LocationID <> po.LocationID AND 
         po2.[Date] >= po.[Date]) 
    GROUP BY po.PackageID 

또한 [LocationID], [PackageID] 및 [Date]에 결합 된 색인을 추가하십시오. CTE 사용은 필요하지 않습니다.