我想使用某些条件进行排名

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 中可用。

【讨论】:

以上是关于我想使用某些条件进行排名的主要内容,如果未能解决你的问题,请参考以下文章

使用条件对行进行排名

SQL/Presto:使用多个条件进行排名(一个条件是检查行是不是在同一个标​​签中)

如何根据某些条件使 Jboss 崩溃

Laravel 数组过滤

Presto SQL - 对多列的多个条件进行排名

基于Python中的多个条件进行过滤