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,非常感谢有关如何实现此类查询结果的任何建议.
谢谢.
一种方法是使用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.
这接近你正在寻找的东西吗?
| 归档时间: |
|
| 查看次数: |
372 次 |
| 最近记录: |