MariaDB/MySQL RANK()实现
我正在进行从MS SQL Server到MariaDB 10.0的迁移。我有一个使用RANK()分区的查询。我已经在我的表上创建了某种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
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小姐