我想根据学生每天的出勤报告对他们进行排名。每个学生的排名应该分别开始。下面是预期的输出,
预期输出:
<表类>studentid 日期 考勤(Y/N) 等级 tbody><<tr>3524 01 - 1月- 2020 N 0 3524 02 - 1月- 2020 N 0 3524 03 - 1月- 2020 N 0 3524 04 -简- 2020 Y 1 3524 05 - 1月- 2020 Y 2 3524 06 - 1月- 2020 Y 3 3524 07 - 1月- 2020 N 0 3524 08 - 1月- 2020 N 0 3524 09 - 1月- 2020 Y 1 3524 10 - 1月- 2020 Y 2 3524 11 - 1月- 2020 Y 3 3524 12 - 1月- 2020 Y 4 5347 04 - 10月- 2020 Y 1 5347 05 - 10月- 2020 Y 2 5347 06 - 10月- 2020 N 0 5347 07 - 10月- 2020 N 0 5347 08 - 10月- 2020 N 0 5347 09 - 10月- 2020 Y 1 5347 10 - 10月- 2020 Y 2 5347 11 - 10月- 2020 Y 3 表类>
你的数据有点乱,很难弄清楚你到底想做什么。
- 您的"预期输出"图像似乎是添加了排名列的出勤报告,所以我从它开始。 你的假日表图像('data')对我来说似乎是不必要的。如果是假期,学生将不会出现在学校,这将反映在出勤报告。
- 我不确定如果学生错过一天会发生什么。排名是从1开始还是从原来的位置开始?
考虑到这一点,我编写了生成预期输出的代码。小提琴
SELECT StudentID
, [Date]
, Attendance
, CASE WHEN Attendance = 'N' THEN 0
ELSE RANK() OVER (PARTITION BY StudentID, Attendance ORDER BY [Date])
END AS Rnk
FROM data
ORDER BY StudentID, [Date]