MariaDB/MySQL RANK() 实施
MariaDB/MySQL RANK() implementation
我正在从 MS SQL 服务器迁移到 MariaDB 10.0。我有使用 RANK() PARTITION BY 的查询。我已经在 table 上创建了某种 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
我想 select 行按 id_partner 排序 updated_at 字段。当id_partner与前一行相同时,RANK应加1。当与前行不同时,应重置为1。
但是我的查询根本不起作用。我仍然在所有行中排名第一。你能帮我找错吗?
感谢您的帮助!
在 MySQL/MariaDB 中使用变量很棘手。一个变量只能在一个语句中使用和赋值(正如你所做的那样)。但是,AND
可以短路变量赋值。
我在 ROW_NUMBER()
中使用了这样的结构。 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;
我正在从 MS SQL 服务器迁移到 MariaDB 10.0。我有使用 RANK() PARTITION BY 的查询。我已经在 table 上创建了某种 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
我想 select 行按 id_partner 排序 updated_at 字段。当id_partner与前一行相同时,RANK应加1。当与前行不同时,应重置为1。
但是我的查询根本不起作用。我仍然在所有行中排名第一。你能帮我找错吗?
感谢您的帮助!
在 MySQL/MariaDB 中使用变量很棘手。一个变量只能在一个语句中使用和赋值(正如你所做的那样)。但是,AND
可以短路变量赋值。
我在 ROW_NUMBER()
中使用了这样的结构。 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;