【问题标题】:SQL - Select max week from a groupSQL - 从组中选择最大周
【发布时间】:2015-05-28 21:15:46
【问题描述】:

我需要能够获得一个结果集,该结果集显示一门课程的最后一位教师,为此我有以下 SQL 查询:

SELECT      
    a.acad_period, MAX(a.start_week) as start_week, 
    a.staff_code, b.aos_code, b.aos_period
FROM 
    qlsdat.dbo.sttstaff a
INNER JOIN 
    qlsdat..sttrgaos b ON a.acad_period = b.acad_period 
                       AND a.register_id = b.register_id
                       AND a.register_group = b.register_group
WHERE 
    a.acad_period = '14/15'
GROUP BY 
    a.acad_period, a.staff_code, b.aos_code, b.aos_period

但是,问题是它返回给我的是该课程老师的最长开始周,而我想要一门课程的最长开始周,以及恰好在该开始周任教的老师。

这是从上述查询返回的示例结果集:

14/15   37  HKARUNATHIL A2ES        001A 
14/15   37  CSHUKLA     A2ES        001B 
14/15   37  PSEDOV      A2ES        002A 
14/15   37  BBANFIELD   A2ES        002B 
14/15   14  VKRISHNASWA A2EX        BL1 X
14/15   14  VKRISHNASWA A2EX        BL2 X
14/15   6   BODAMEKENTO ACA2        BL1 A
14/15   41  SKLER       ACA2        BL1 A
14/15   44  BODAMEKENTO ACAS        BL1 F
14/15   37  MMILLER     ARA2        BL1 C
14/15   45  MMILLER     ARAS        BL1 E
14/15   44  SHOULTON    ARAS        BL1 E

以下是结果集中的问题示例:

14/15   10  HMALIK      MMGX        GB2F3
14/15   44  JMULLANEY   MMGX        GB2F3

在上面的例子中我只想要:

14/15   44  JMULLANEY   MMGX        GB2F3

生成的查询将用作另一个查询中的子查询。

【问题讨论】:

    标签: tsql sql-server-2005


    【解决方案1】:

    这将获得最高 start_week 的行,但是如果您有超过 1 年的数据,您可能会遇到一些问题,这可以通过将您的字段添加到本部分中的周列来解决

    row_number() over (partition by 
                         a.acad_period, b.aos_code, b.aos_period 
                       order by 
                         a.start_year desc, 
                         a.start_date desc) rn
    

    查询:

    ;WITH CTE AS
    (
        SELECT      
            a.acad_period, a.start_week,
            a.staff_code, b.aos_code, b.aos_period,
            row_number() over (partition by 
                                 a.acad_period, b.aos_code,
                                 b.aos_period 
                               order by a.start_week desc) rn
        FROM 
            qlsdat.dbo.sttstaff a
        INNER JOIN 
            qlsdat..sttrgaos b ON a.acad_period = b.acad_period 
                               AND a.register_id = b.register_id
                               AND a.register_group = b.register_group
        WHERE 
            a.acad_period = '14/15'
    )
    SELECT 
        acad_period, start_week,
        staff_code, aos_code, aos_period,
    FROM CTE
    WHERE rn = 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 2022-11-13
      • 2022-10-13
      • 2013-10-06
      • 2023-03-12
      • 2018-02-26
      相关资源
      最近更新 更多