我想使用某些条件进行排名
Posted
技术标签:
【中文标题】我想使用某些条件进行排名【英文标题】:I want rank using some condition 【发布时间】:2019-09-25 08:43:33 【问题描述】:我想使用总数和一些条件(例如exam_Id、class_id、section_id、年份)进行排名。我有很多数据使用不同的exam_Id、class_id、section_id、年份。现在我想在这些项目(exam_Id、class_id、section_id、year)匹配时对它们进行排名。 在下面,我给了你一个 sql 查询,我在其中尝试了一些东西,但它给出了整个结果。
SELECT id, student_id, total_mark, FIND_IN_SET( total_mark, (
SELECT GROUP_CONCAT( total_mark
ORDER BY total_mark DESC )
FROM total_marks )
) AS rank
FROM total_marks
SQL fiddle Link
【问题讨论】:
能否请您创建一个SQL fiddle或发布一个表数据,以便社区更好地了解 我不知道如何创建 SQL fiddle sqlfiddle.com请查看本站或发布表格数据和期望结果 sqlfiddle.com/#!9/609627/1/0 样本数据和期望的结果在问题中将有助于解释你想要做什么。 【参考方案1】:如果你想对记录组进行排名——使用这种方法——那么你需要一个相关的子查询:
SELECT id, student_id, exam_id, class_id, total_mark, section_id, year,
FIND_IN_SET(total_mark,
(SELECT GROUP_CONCAT( total_mark ORDER BY total_mark DESC )
FROM total_marks tm2
WHERE tm2.exam_Id = tm.exam_id AND
tm2.class_id = tm.class_id AND
tm2.section_id = tm.section_id AND
tm2.year = tm.year
)
) AS rank
FROM total_marks tm;
Here 是一个 dbfiddle。
注意正确的写法是使用窗口函数:
SELECT tm.*,
RANK() OVER (PARTITION BY exam_Id, class_id, section_id, year
ORDER BY total_mark DESC
) as rank
FROM total_marks tm;
此函数是标准 SQL,自 8.0 版本起在 mysql 中可用。
【讨论】:
以上是关于我想使用某些条件进行排名的主要内容,如果未能解决你的问题,请参考以下文章