MariaDB/MySQL RANK()实现

MariaDB/MySQL RANK()实现,mysql,sql,mariadb,rank,Mysql,Sql,Mariadb,Rank,我正在进行从MS SQL Server到MariaDB 10.0的迁移。我有一个使用RANK()分区的查询。我已经在我的表上创建了某种RANK()实现,但它不能正常工作 原始查询是: RANK() OVER (PARTITION BY visits.id_partner ORDER BY visits.updated_at DESC) AS rank SELECT ..., ( CASE visits.id_partner WHEN @c

我正在进行从MS SQL Server到MariaDB 10.0的迁移。我有一个使用RANK()分区的查询。我已经在我的表上创建了某种RANK()实现,但它不能正常工作

原始查询是:

RANK() OVER (PARTITION BY visits.id_partner ORDER BY visits.updated_at DESC) AS rank
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
我的MariaDB/MySQL实现:

RANK() OVER (PARTITION BY visits.id_partner ORDER BY visits.updated_at DESC) AS rank
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
我想在字段中选择按id\u合作伙伴顺序按更新的\u排序的行。当id_伙伴与前一行相同时,排名应增加1。与以前不同时,应重置为1

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


谢谢你的帮助

在MySQL/MariaDB中使用变量是很棘手的。一个变量只能在一个语句中使用和赋值(正确的做法是这样的)。但是,
可以使变量分配短路

对于
行号()
,我使用这样的构造
RANK()
实际上有点痛苦
densite\u RANK()
ROW\u 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;

我已经试着像你说的那样重写查询,但是我仍然有相同的结果——MS SQL Server标记是什么?(不要给未涉及的产品贴标签…)很抱歉,可能是click小姐