【问题标题】:MariaDB/MySQL RANK() implementationMariaDB/MySQL RANK() 实现
【发布时间】:2016-01-30 19:55:34
【问题描述】:

我正在从 MS SQL Server 迁移到 MariaDB 10.0。我有使用 RANK() PARTITION BY 的查询。我已经在我的桌子上创建了某种 RANK() 实现,但它不能正常工作。

原来的查询是:

RANK() OVER (PARTITION BY visits.id_partner ORDER BY visits.updated_at DESC) AS rank

我的 MariaDB/MySQL 实现:

SELECT
    ...,
    (
        CASE visits.id_partner
            WHEN @currId THEN
                @curRow := @curRow + 1
            ELSE
                @curRow := 1 AND @currId := visits.id_partner
        END
    ) AS rank
FROM
    records rec
    JOIN visits ON visits.id = rec.id_visit,
    (
        SELECT
        @curRank := 0,
        @currId := NULL
    ) r
WHERE
    ...
ORDER BY visits.id_partner ASC, visits.updated_at DESC

我想通过 updated_at 字段选择按 id_partner 顺序排列的行。当 id_partner 与前一行相同时,RANK 应加 1。当与前不同时,应重置为 1。

但是我的查询根本不起作用。我在所有行上仍然排名第一。你能帮我找出错误吗?

感谢您的帮助!

【问题讨论】:

  • MS SQL Server标签怎么来的? (不要标记未涉及的产品...)
  • 很抱歉,可能是误点击

标签: mysql sql mariadb rank


【解决方案1】:

在 MySQL/MariaDB 中使用变量很棘手。一个变量应该只在一个语句中使用和分配(就像你做的那样)。但是,AND 可以使变量赋值短路。

我对@9​​87654322@ 使用了这样的构造。 RANK() 其实有点心疼。 . . DENSE_RANK() 和 ROW_NUMBER() 更简单。但是,这似乎是您的目标代码:

SELECT ...,
       (@rn := if(@currId = visits.id_partner, @rn + 1,
                  if(@currId := visits.id_partner, 1, 1)
                 )
       ) as rank
FROM records rec JOIN
     visits
     ON visits.id = rec.id_visit CROSS JOIN
     (SELECT @rn := 0, @currId := NULL) params
WHERE
    ...
ORDER BY visits.id_partner ASC, visits.updated_at DESC;

编辑:

在 MySQL(可能是 MariaDB)中,有时变量不能正常工作,除非您使用子查询。所以,试试这个:

SELECT . . .,
       (@rn := if(@currId = visits.id_partner, @rn + 1,
                  if(@currId := visits.id_partner, 1, 1)
                 )
       ) as rank
FROM (SELECT ...
      FROM records rec JOIN
           visits
           ON visits.id = rec.id_visit 
      WHERE
          ...
      ORDER BY visits.id_partner ASC, visits.updated_at DESC
     ) t CROSS JOIN
     (SELECT @rn := 0, @currId := NULL) params;

【讨论】:

  • 我已经尝试像你说的那样重写查询,但结果还是一样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-19
  • 2013-10-14
  • 1970-01-01
  • 2014-01-24
  • 2022-06-14
  • 1970-01-01
相关资源
最近更新 更多