查询每个人参加的最后一个活动

CHS*_*CHS 3 sql t-sql sql-server sql-server-2012

我有一个名为CampRegistration的表,其结构如下:

[EID] INT, [CampName] VARCHAR(100), [StartDt] DATETIME
Run Code Online (Sandbox Code Playgroud)

EID是参加营地的人的标识符.我希望在给定日期之前选择CampRegistration表中每个人参加的最后一个营地.

这是我的第一次尝试:

@DECLARE @currentCampDt DATETIME = '2012-8-4';
SELECT [EID], [CampName], MAX([StartDt]) [StartDt]
FROM [CampRegistration]
WHERE [StartDt] < @currentCampDt 
GROUP BY [EID],[CampName]
order by [EID]
Run Code Online (Sandbox Code Playgroud)

这里的问题是,如果有人参加了多个不同名称的营地,我会得到该人的多个结果(每个营地名称的最后一次参加).我只想为每个人拿回一张单曲,这是他们参加的任何名字的最后一个阵营.我最终需要得到这些三块信息的每个记录(EID,CampName和阵营的StartDt),所以我不知道如果我真的可以从删除CampName Group By.

我正在使用SQL Server 2012,非常感谢有关如何实现此类查询结果的任何建议.

谢谢.

mar*_*c_s 5

一种方法是使用CTE(公用表表达式).

有了这个CTE,可以通过一些标准划分您的数据-即你的EID-并有从1开始为每个"分区",通过一些标准下令SQL服务器数量的所有行.

所以尝试这样的事情:

;WITH CampEvents AS
(
   SELECT 
       EID, CampName, StartDt,
       RowNum = ROW_NUMBER() OVER(PARTITION BY EID ORDER BY StartDt DESC)
   FROM 
       dbo.CampRegistration
)
SELECT 
   EID, CampName, StartDt
FROM 
   CampEvents
WHERE
   RowNum = 1
Run Code Online (Sandbox Code Playgroud)

在这里,我只选择每个"分区"的"第一个"条目(即每个分区EID) - 按降序排序StartDt- 所以最新的,最近的事件有RowNum = 1.

这接近你正在寻找的东西吗?