SQL - 从组中选择最长周

时间:2015-03-25 09:18:26

标签: tsql sql-server-2005

我需要能够获得一个结果集,其中显示了课程的最后一位教师,我有以下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

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

1 个答案:

答案 0 :(得分: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