【问题标题】:Selecting the first record in a "group"选择“组”中的第一条记录
【发布时间】:2025-12-13 19:50:01
【问题描述】:

我正在编写一个 Sequel Server 2008 查询来提取数据,这将允许我制作具有“校友自”字段的校友卡。我已经得到查询以提取他们所有的课程记录——现在我想缩小范围,只包括最旧的课程。

到目前为止,我的代码如下所示。

我在网上查看并尝试了整行分区以及将整个最小/最大值与组一起使用,但我并没有取得太大的成功。其中唯一的唯一值是 UserID——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

【问题讨论】:

    标签: sql sql-server-2008 group-by partitioning


    【解决方案1】:

    您可以将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

    【讨论】:

    • 谢谢谢谢!!我发现我只需要添加我的 where 子句操作数来拉出初始行(它们就在第一个 FROM 语句的下方)
    最近更新 更多