SQL - Select 一组最多一周

SQL - Select max week from a group

我需要能够得到一个结果集来显示课程的最后一位老师,对此我有以下 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

但是,问题是 returns 对我来说,这门课程的老师的最长开始周数是那开始的一周。

下面是上述查询返回的示例结果集:

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

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

这将获得最高的行 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