SQL中基于特定列条件的 rank()



我想根据学生每天的出勤报告对他们进行排名。每个学生的排名应该分别开始。下面是预期的输出,

预期输出:

<表类>studentid日期考勤(Y/N)等级tbody><<tr>352401 - 1月- 2020N0352402 - 1月- 2020N0352403 - 1月- 2020N0352404 -简- 2020Y1352405 - 1月- 2020Y2352406 - 1月- 2020Y3352407 - 1月- 2020N0352408 - 1月- 2020N0352409 - 1月- 2020Y1352410 - 1月- 2020Y2352411 - 1月- 2020Y3352412 - 1月- 2020Y4534704 - 10月- 2020Y1534705 - 10月- 2020Y2534706 - 10月- 2020N0534707 - 10月- 2020N0534708 - 10月- 2020N0534709 - 10月- 2020Y1534710 - 10月- 2020Y2534711 - 10月- 2020Y3

你的数据有点乱,很难弄清楚你到底想做什么。

  1. 您的"预期输出"图像似乎是添加了排名列的出勤报告,所以我从它开始。
  2. 你的假日表图像('data')对我来说似乎是不必要的。如果是假期,学生将不会出现在学校,这将反映在出勤报告。
  3. 我不确定如果学生错过一天会发生什么。排名是从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]

最新更新