代码之家  ›  专栏  ›  技术社区  ›  Jerod Venema

SQL中的子组计数

  •  1
  • Jerod Venema  · 技术社区  · 15 年前

    我有一个查询,如下所示:

    select
        c.[Name], 
        c.Description, 
        c.ID,
        cd.StartDateTime
    from
        Classroom.dbo.Class as c
    left join
        Classroom.dbo.Course as co
    on
        co.ID = c.CourseID
    left join
        Classroom.dbo.Classdate as cd
    on
        cd.ClassID = c.ID
    where
        co.PublicIndicator = 1
    

    这个查询只是给了我一个类列表以及它们发生的日期。关系是:

    • 一门课程可以有很多课
    • 一个班可以有一门课和许多上课日期
    • 上课日期只能有一个班级

    我想添加的是,对于具有多个类日期的类,添加一个“计数器”,它可以告诉我正在处理的类的哪个“实例”。比如:

    Test    test    1   2009-08-19 05:00:00     1
    Test    test    1   2009-08-20 05:00:00     2
    Test    a       2   2009-10-22 08:00:00     1
    Test    a       3   2009-10-30 07:00:00     1
    Test    a       5   2009-10-21 11:00:00     1
    

    最后一列是我想看到的额外列,这表明在这个场景中,第二行是这个类的第二天。

    思想?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Dave Barker    15 年前

    over子句应该给你想要的。从 MSDN

    SELECT c.[Name], c.Description, c.ID, cd.StartDateTime, 
           ROW_NUMBER() OVER(PARTITION BY c.Id Order BY cd.StartDateTime)
      FROM Classroom.dbo.Class as c
      LEFT JOIN Classroom.dbo.Course as co
        ON co.ID = c.CourseID
      LEFT JOIN Classroom.dbo.Classdate as cd
        ON cd.ClassID = c.ID
     WHERE co.PublicIndicator = 1