我正在从MS迁移到MariaDB 10.0。我有使用秩()分区的查询。我已经在我的表上创建了某种级别()实现,但是它不能正常工作。
最初的查询是:
RANK() OVER (PARTITION BY visits.id_partner ORDER BY visits.updated_at DESC) AS rankMy实现的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我想选择按id_partner排序按updated_at字段排列的行。当id_partner与行前相同时,秩应增加1。当与以前不同时,应将其重置为1。
但我的查询根本不起作用。我在所有行中都排在第一位。你能帮我找出错误吗?
谢谢你的帮助!
发布于 2015-10-30 11:46:13
在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;https://stackoverflow.com/questions/33435162
复制相似问题