使用旧版本的 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 吗? [复制]

什么是 realloc() 的 C++ 版本,用于分配新缓冲区并从旧缓冲区复制内容?

MySQL 复制表到另一个表

MySQL 复制表到另一个表

MySql中,复制旧表结构到新表