公用表表达式选择最后一次观察位于某个位置的位置

时间:2014-11-13 04:56:29

标签: tsql common-table-expression

我有以下表格

位置表

[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 个答案:

答案 0 :(得分:1)

您可以使用以下SQL语句:

  DECLARE @locationID int = 1

  SELECT po.PackageID, MAX(po.[Date]) AS DateAtLocation 
  FROM PackageObservation po 
  WHERE po.LocationID=@locationID
  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。