SQL Server присоединиться к группе, выбрав количество строк в группе - PullRequest
0 голосов
/ 04 июня 2019

есть одна таблица, которая содержит следующие строки:

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

Теперь ожидаемый результат, который я хочу получить, для каждого deptName: последняя строка таблицы выше с упорядочением по годам в порядке убывания, также с оценкой соответствующего студента за предыдущий год (означает текущую оценку строки как текущую оценку и оценку второй строки как предыдущую). оценка, если она недоступна, значение будет нулевым)

как написать 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 Ответ

1 голос
/ 04 июня 2019

Попробуйте, используя оконную функцию, я нахожу студента и его оценки на основе последнего года, и я использую 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
...