【问题标题】:sql server join with group by with selecting number of rows from groupsql server join with group by 从组中选择行数
【发布时间】:2019-10-19 18:56:11
【问题描述】:

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

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

现在,我想要的预期结果是每个部门名称:上表的最新行,按年份降序排列,每个学生的前一年分数也降序排列。(表示当前行分数为当前分数,其第二行分数为上一个score 如果不可用,则 value 将为 null)

如何为这个结果编写 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

【问题讨论】:

  • 嗨,找到我的答案
  • 您好,我刚刚编辑了答案,我使用前导函数来获取上一年的分数,而不是 Lag()

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


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 2021-11-06
    相关资源
    最近更新 更多