mysql SQL查询问题-获取特定学生的级别和职位

vwhgwdsa  于 2024-01-05  发布在  Mysql
关注(0)|答案(1)|浏览(163)

我目前正在使用一个SQL查询,根据特定学生在特定班级、部分和课程中的平均分数来检索他们的排名和位置。然而,我遇到了一个问题,当我包含一个WHERE子句来获取特定学生的详细信息时,查询只返回最高排名(1)。

以下是我的查询

  1. WITH RankedAverages AS (
  2. SELECT
  3. `student_id`,
  4. `class_id`,
  5. `section_id`,
  6. `session_id`,
  7. CAST(AVG(ft_tot_score) AS DECIMAL(10, 2)) AS unique_average,
  8. TRUNCATE(AVG(ft_tot_score), 0) AS average_range
  9. FROM
  10. ftscores_primary
  11. WHERE
  12. `student_id`=870 AND
  13. class_id = 9 AND
  14. section_id = 3 AND
  15. session_id = 19
  16. GROUP BY
  17. `student_id`,
  18. `class_id`,
  19. `section_id`,
  20. `session_id`
  21. ),
  22. RankedWithDenseRank AS (
  23. SELECT
  24. `student_id`,
  25. `class_id`,
  26. `section_id`,
  27. `session_id`,
  28. unique_average,
  29. DENSE_RANK() OVER (ORDER BY average_range DESC) AS dense_rank
  30. FROM
  31. RankedAverages
  32. ),
  33. RankedWithPositions AS (
  34. SELECT
  35. `student_id`,
  36. `class_id`,
  37. `section_id`,
  38. `session_id`,
  39. unique_average,
  40. CASE
  41. WHEN RANK() OVER (ORDER BY unique_average DESC) = 1 THEN 1
  42. WHEN RANK() OVER (ORDER BY unique_average DESC) = 2 THEN 2
  43. WHEN RANK() OVER (ORDER BY unique_average DESC) = 3 THEN 3
  44. ELSE dense_rank + 1
  45. END AS position
  46. FROM
  47. RankedWithDenseRank
  48. )
  49. SELECT
  50. `student_id`,
  51. `class_id`,
  52. `section_id`,
  53. `session_id`,
  54. unique_average,
  55. position
  56. FROM
  57. RankedWithPositions
  58. ORDER BY
  59. position, unique_average DESC;

字符串
如果没有这个WHERE子句student_id = 870,我将得到一个关于某个班级学生等级的漂亮表格。
但是,如果我添加WHERE子句student_id = 870,它在位置列中输出1,但真实的位置是4。
任何人都可以帮助我确定我的问题在我的查询或建议一种替代方法来实现所需的结果?任何见解或更正查询结构将不胜感激.

nfzehxib

nfzehxib1#

这就是我所做的

  1. WITH RankedAverages AS (
  2. SELECT
  3. student_id,
  4. class_id,
  5. section_id,
  6. session_id,
  7. CAST(AVG(ft_tot_score) AS DECIMAL(10, 2)) AS unique_average,
  8. TRUNCATE(AVG(ft_tot_score), 0) AS average_range
  9. FROM ftscores_primary
  10. WHERE session_id = 19 AND
  11. class_id =9 AND
  12. section_id = 3
  13. GROUP BY student_id
  14. ),
  15. RankedWithDenseRank AS (
  16. SELECT
  17. student_id,
  18. class_id,
  19. section_id,
  20. session_id,
  21. unique_average,
  22. DENSE_RANK() OVER (ORDER BY average_range DESC) AS dense_rank
  23. FROM RankedAverages
  24. ),
  25. RankedWithPositions AS (
  26. SELECT
  27. student_id,
  28. class_id,
  29. section_id,
  30. session_id,
  31. unique_average,
  32. CASE
  33. WHEN RANK() OVER (ORDER BY unique_average DESC) = 1 THEN 1
  34. WHEN RANK() OVER (ORDER BY unique_average DESC) = 2 THEN 2
  35. WHEN RANK() OVER (ORDER BY unique_average DESC) = 3 THEN 3
  36. ELSE dense_rank + 1
  37. END AS position
  38. FROM RankedWithDenseRank
  39. )
  40. SELECT
  41. student_id,
  42. class_id,
  43. section_id,
  44. session_id,
  45. unique_average,
  46. position
  47. FROM RankedWithPositions
  48. WHERE student_id = 870
  49. ORDER BY position, unique_average DESC;

字符串

展开查看全部

相关问题