2013-10-28 36 views
2

我正在编写一个Sequel Server 2008查询来提取数据,这将允许我制作拥有“校友自从”字段的校友卡。我已经得到了我的查询来提取他们所有的课程记录 - 现在我想缩小它的范围,只包括最老的课程。在“群组”中选择第一条记录

我的代码到目前为止列出如下。

我在网上看了一遍,尝试了整行分区的事情以及使用整个min/max组,但我没有取得太多的成功。唯一的唯一价值就是用户ID - CourseID本质上是课程名称的缩写(每个课程每年提供几次)。我在这里看到的所有类似示例都没有任何WHERE子句来提取最初的数据集,所以我不确定它们的位置。

任何帮助或建议将非常欢迎!

SELECT 
    DisplayName, UserID, CourseID, EndDate 
FROM 
    BigTable 
WHERE 
    SIMPLE WHERE CLAUSE 1 
    AND SIMPLE WHERE CLAUSE 2 
    AND SIMPLE WHERE CLAUSE 3 
ORDER BY LastName, FirstName, MiddleName, EndDate ASC 

生成此:

DisplayName UserID CourseID EndDate 
-------------|--------|--------|------------------------ 
John Doe  | 123579 | DPRM | 2000-09-29 00:00:00.000 
Mother Goose | 121157 | ICCT | 2009-06-19 00:00:00.000 
Boy Horner | 117223 | ICCT | 2003-11-21 00:00:00.000 
Boy Horner | 117223 | DPRM | 2008-06-20 00:00:00.000 
Miss Muffett | 115280 | SDPB | 2006-11-03 00:00:00.000 
Simple Simon | 190423 | SDPB | 2013-10-11 00:00:00.000 
Jack Sprat | 115868 | SDPA | 2005-11-04 00:00:00.000 
Jack Sprat | 115868 | SSTR | 2008-11-07 00:00:00.000 

的输出类型,我希望会是这个样子(每人只有一个符合自己最早的结束日期)

DisplayName UserID CourseID EndDate 
-------------|--------|--------|------------------------ 
John Doe  | 123579 | DPRM | 2000-09-29 00:00:00.000 
Mother Goose | 121157 | ICCT | 2009-06-19 00:00:00.000 
Boy Horner | 117223 | ICCT | 2003-11-21 00:00:00.000 
Miss Muffett | 115280 | SDPB | 2006-11-03 00:00:00.000 
Simple Simon | 190423 | SDPB | 2013-10-11 00:00:00.000 
Jack Sprat | 115868 | SDPA | 2005-11-04 00:00:00.000 

回答

2

你可以的使用ROW_NUMBERCTE

WITH CTE AS 
(
    SELECT DisplayName, UserID, CourseID, EndDate, 
     RN = ROW_NUMBER() OVER (PARTITION BY UserID ORDER BY EndDate ASC) 
    FROM dbo.TableName 
) 
SELECT DisplayName, UserID, CourseID, EndDate 
FROM CTE WHERE RN = 1 

Demo

+0

谢谢你谢谢你!我发现我只需要添加我的where子句操作数来提取最初的行(它们正好在第一个FROM语句下面) – WufPupster