使用旧版本 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;
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;