3

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

[EID] INT, [CampName] VARCHAR(100), [StartDt] DATETIME

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]

这里的问题是,如果有人参加了多个不同名称的营地,我会得到那个人的多个结果(每个营地名称的最后参加者)。我只希望为每个人找回一个记录,他们参加的任何名字的最后一个营地。我最终确实需要为每条记录(EID、CampName 和营地的 StartDt)获取这三条信息,所以我不确定我是否真的可以从Group By.

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

谢谢。

4

3 回答 3

5

一种方法是使用 CTE(通用表表达式)。

使用此 CTE,您可以按某些标准(即您的)对数据进行分区,EID并让 SQL Server 为每个“分区”从 1 开始为您的所有行编号,并按某些标准排序。

所以尝试这样的事情:

;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

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

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

于 2013-01-05T09:24:06.427 回答
2

这不会很快,但会做到:

@DECLARE @currentCampDt DATETIME = '2012-8-4';

SELECT o.[EID], o.[CampName], o.[StartDt]
FROM [CampRegistration] o
WHERE o.[StartDt] = ( 
                      SELECT MAX(i.[StartDt]) 
                      FROM [CampRegistration] i WHERE i.[StartDt] < @currentCampDt
                      AND
                      i.[EID] = o.[EID]
                    )
order by o.[EID]
于 2013-01-05T09:23:58.630 回答
1

你可以这样做:

WITH LastCampsAttended
As
(
  SELECT *,
    ROW_NUMBER() OVER(PARTITION BY EID ORDER BY StartDt DESC) AS rownum
  FROM CampRegistration
  WHERE [StartDt] < @currentCampDt 
)
SELECT 
  EID,
  CampName,
  StartDt
FROM LastCampsAttended
WHERE rownum = 1;

SQL 小提琴演示

或者:

SELECT
  camps.*
FROM CampRegistration camps
INNER JOIN 
(
  SELECT EID, MAX(StartDt) LatestDate
  FROM CampRegistration
  GROUP BY EID
) LatestCamps  ON camps.EID = LatestCamps.EID
              AND camps.StartDt = LatestCamps.LatestDate
WHERE camps.StartDt < @currentCampDt ;

更新的 SQL 小提琴演示

于 2013-01-05T09:23:18.567 回答