使用旧版本 MYSQL 复制行号

Replicate Row Number with older version of MYSQL

MySQL(旧版本)是否有复制 SQL 服务器函数 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(*) 似乎不适合那里的解决方案。

输入

类别
1 汽车
2 自行车
2 汽车
1 汽车
3 卡车
1 自行车
1 汽车
3 汽车
3 汽车
2 自行车
1 自行车
2 卡车
2 卡车
2 卡车

预期输出:每天前 2 个类别(及其总数)

类别 类别计数
1 汽车 3
1 自行车 2
2 自行车 2
2 卡车 2
3 汽车 2
3 卡车 1

I am trying to find 2 most used categories with their usage count per day using this query but ROW_NUMBER and PARTITION are not available in my old version of 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;