mysql - sql对行结果进行排名

标签 mysql sql rank row-number

我正在尝试添加一个新列,用于按日期显示行结果的排名(或顺序)。

我写的是:

 SELECT 
@row_number:=(CASE
    WHEN @member_id = lh.member_id and lc.ladder_advocacy is not null 
        THEN @row_number + 1
    when @member_id = lh.member_id and lc.ladder_advocacy is null then "null"
    ELSE 1 /* there is an error here - i need it to return a 1 if not null, then 2 for the 2nd instance, etc */ 
END) AS rank_advocacy,
@member_id:=lh.member_id AS member_id,
lh.ladder_change,
lc.name,
lc.ladder_advocacy,
lc.ladder_elected,
lc.ladder_policy,
lc.ladder_engagement,
lc.ladder_newventure,
lc.ladder_collective,
lc.is_trigger
FROM
leenk_ladder_history AS lh
    LEFT JOIN
leeds_so.leenk_ladder_config AS lc ON lh.ladder_config_id = lc.id
WHERE
ladder_change = 1 AND trigger_active = 1
ORDER BY member_id, trigger_event_date DESC; 

第 4 行有错误,我不知道如何修复它。对于第一个结果,我想返回 1。对于第二个结果,我想返回 @row_number + 1。第三个结果,@row_number+2 (等等)。

我该如何实现这一目标?

最佳答案

我不明白如何使用条件lc.ladder_advocacy is not null。然而,基本结构是:

SELECT (@row_number = IF(@member_id = lh.member_id, @row_number + 1
                         IF(@member_id := lh.member_id, 1, 1)
                        )
       ) as rank_advocacy,
       lh.ladder_change,
       . . .

一些非常重要的点:

  • 您需要在同一表达式中分配@member_id@row_number。 MySQL(与所有其他数据库一样)不保证表达式求值的顺序。
  • 在最新版本的 MySQL 中,我认为 ORDER BY 需要放入子查询中,变量表达式位于外部查询中。

关于mysql - sql对行结果进行排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51289551/

相关文章:

mysql - 正则表达式复制粘贴行并在每个行的末尾添加递增的数字

sql - 用于存储类(class)章节主题副主题的数据库设计结构

mysql - 如何查询以获得行的排名?

r - 在给定日期-30天之内对学生的最新分数进行排名

php - 如何在 php 中对具有相似值的数据进行分组?

php - 使用自动递增时出现语法错误

mysql - sql: Char() 的反向函数

SQL 子句与表达式术语

excel - 在 Excel 中使用排名函数

Java - 小程序异常