首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MariaDB/MySQL RANK()实现

MariaDB/MySQL RANK()实现
EN

Stack Overflow用户
提问于 2015-10-30 11:41:59
回答 1查看 2.4K关注 0票数 1

我正在从MS迁移到MariaDB 10.0。我有使用秩()分区的查询。我已经在我的表上创建了某种级别()实现,但是它不能正常工作。

最初的查询是:

代码语言:javascript
复制
RANK() OVER (PARTITION BY visits.id_partner ORDER BY visits.updated_at DESC) AS rank

My实现的MariaDB/MySQL:

代码语言:javascript
复制
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_partner排序按updated_at字段排列的行。当id_partner与行前相同时,秩应增加1。当与以前不同时,应将其重置为1。

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

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-30 11:46:13

在MySQL/MariaDB中使用变量是很棘手的。变量只能在一条语句中使用和赋值(正如您正确地做的那样)。然而,AND可以短路变量分配.

我为ROW_NUMBER()使用了这样的构造。RANK()实际上有点痛苦。。。DENSE_RANK()ROW_NUMBER()比较简单。但是,这似乎是您的目标代码:

代码语言:javascript
复制
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中)中,有时变量不能很好地工作,除非您使用子查询。所以,试试这个:

代码语言:javascript
复制
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;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33435162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档