使用旧版本的 MYSQL 复制行号
Posted
技术标签:
【中文标题】使用旧版本的 MYSQL 复制行号【英文标题】:Replicate Row Number with older version of MYSQL 【发布时间】:2021-08-27 05:48:36 【问题描述】:在 mysql(旧版本)中有没有很好的方法来复制 SQL Server 函数 ROW_NUMBER()?
我正在尝试使用此查询查找 2 个最常用的类别及其每天的使用次数,但 ROW_NUMBER 和 PARTITION 在我的旧版本 SQL 中不可用。
Select a.*
FROM
( SELECT
dDay,
category,
COUNT(*) as CountOfCategory,
ROW_NUMBER() OVER (PARTITION BY dDay ORDER BY COUNT(*) DESC) AS intRow
FROM Table1
GROUP BY category, dDate ) as a
WHERE intRow <= 2
ORDER BY dDay,
intRow;
这个问题here 有一个变体,但我的查询中的COUNT(*)
似乎不适合那里的解决方案。
输入
dDay | Category |
---|---|
1 | car |
2 | bike |
2 | car |
1 | car |
3 | truck |
1 | bike |
1 | car |
3 | car |
3 | car |
2 | bike |
1 | bike |
2 | truck |
2 | truck |
2 | truck |
预期产出:每天前 2 个类别(及其总数)
dDay | Category | CountOfCategory |
---|---|---|
1 | car | 3 |
1 | bike | 2 |
2 | bike | 2 |
2 | truck | 2 |
3 | car | 2 |
3 | truck | 1 |
【问题讨论】:
请提供示例数据、预期输出和特定的 MySQL 版本。 举例 这是错误的例子。语法错误。如果您将禁用 ONLY_FULL_GROUP_BY,则逻辑上是错误的。 @FaNo_FN 添加了更多详细信息。 【参考方案1】:我正在尝试使用此查询查找 2 个最常用的类别及其每天的使用次数,但 ROW_NUMBER 和 PARTITION 在我的旧版本 SQL 中不可用。
在旧版本的 MySQL 中,我认为最简单的解决方案是将类别放在单个列中,使用两个级别的聚合:
SELECT dDay,
SUBSTRING_INDEX(GROUP_CONCAT(category, ':', CountOfCategory ORDER BY CountOfCategory DESC), ',', 2)
FROM (SELECT dDay, category, COUNT(*) as CountOfCategory,
FROM Table1
GROUP BY category, dDate
) cd
GROUP BY dDay;
希望在您能够升级到更现代的 MySQL 版本之前,这已经足够了。
编辑:
你实际上可以使用变量做你想做的事:
SELECT cd.*
FROM (SELECT cd.*,
(@rn := if(@d = dDay, @rn + 1,
if(@d := dDay, 1, 1)
)
) as rn
FROM (SELECT dDay, category, COUNT(*) as CountOfCategory,
FROM Table1
GROUP BY category, dDate
ORDER BY dDate, COUNT(*) DESC
) cd CROSS JOIN
(SELECT @d := -1, @rn := 0) params
) cd
WHERE rn <= 2
ORDER BY dDate, rn;
【讨论】:
非常感谢您提供这些解决方案。正是我想要的。以上是关于使用旧版本的 MYSQL 复制行号的主要内容,如果未能解决你的问题,请参考以下文章
如何使使用旧 Java 版本开发的应用程序在 jdk 9 或更高版本上运行? [复制]
我可以安装旧版本的 Worklight Studio 吗? [复制]