sql server通过选择组中的行数与组连接

时间:2019-06-04 08:57:43

标签: sql-server group-by sql-order-by

有一个表,其中包含以下几行:

guid, id, deptName, studentName, Score, Year
guid, 1, IT, ABC, 50, 2019
guid, 2, IT, XYZ, 80, 2018
guid, 1, IT, ABC, 70, 2018
guid, 4, CS, LMN, 60, 2019

现在,我想要的预期结果是每个部门名称:上表的最新行,按年级从高到低的顺序逐年排序,也分别是各学生的上一年度分数。(表示当前行分数为当前分数,第二行分数为前一个分数)得分(如果不可用则为空)

如何为此结果编写sql查询?

guid, id, deptName, studentName, Score, Year, PreviousYearScore
guid, 1, IT, ABC, 50, 2019, 70
guid, 4, CS, LMN, 60, 2019, NULL

因此,结果模型将类似于:

id, deptName, studentName, Score, Year, PreviousYearScore

1 个答案:

答案 0 :(得分:1)

尝试此操作,使用窗口函数,我根据最近一年查找学生及其分数,并使用LEAD()查找上一年的分数

;WITH CTE (guid, id, deptName, studentName, Score, Year)
AS
(
SELECT 'guid', 1, 'IT', 'ABC', 50, 2019 UNION ALL
SELECT 'guid', 2, 'IT', 'XYZ', 80, 2018 UNION ALL
SELECT 'guid', 1, 'IT', 'ABC', 70, 2018 UNION ALL
SELECT 'guid', 4, 'CS', 'LMN', 60, 2019
)
SELECT [guid],
       id,
       deptName,
       studentName,
       Score,
       [Year],
       PreviousYearScore
FROM
(
SELECT * , ROW_NUMBER()OVER(PARTITION BY deptName ORDER BY [Year] DESC) AS Rnk,
            LEAD(Score,1)OVER(PARTITION BY deptName ORDER BY [Year] DESC) PreviousYearScore     
FROM CTE
)dt 
WHERE Rnk = 1
ORDER BY Id

结果

guid    id  deptName    studentName Score   Year   PreviousYearScore
------------------------------------------------------------------------
guid    1     IT            ABC      50     2019        70
guid    4     CS            LMN      60     2019        NULL