我需要使用单个查询将一个表排序成一个顺序,其中有三个偶数批排序的记录.

下面是一个示例表.

id     value
1      356
2      243
3      321
4      123
5      654
6      222
7      102
8      900
9      489

一个简单的ORDER BY value DESC就能产生

id     value
8      900
5      654
9      489
1      356
3      321
2      243
6      222
4      123
7      102

然而,我需要的是这个列表被分成三个相等的部分,就像这样(为了清楚起见,增加了空行)……

id     value

8      900
1      356
6      222

5      654
3      321
4      123

9      489
2      243
7      102

如果我可以在初始排序中添加一个假想的临时帮助器列,如下所示(请注意,这个帮助器列实际上并不存在于我的表中,我在这里添加它只是为了帮助说明这个问题)……

id     value    helper
8      900      1
5      654      2
9      489      3
1      356      1
3      321      2
2      243      3
6      222      1
4      123      2
7      102      3

我可以用ORDER BY helper, value英镑买到我想要的那种……

id     value    helper
8      900      1
1      356      1
6      222      1
5      654      2
3      321      2
4      123      2
9      489      3
2      243      3
7      102      3

但是,同样,Helper列是虚构的,我的表中并没有它.考虑到表中的数据,我不知道如何从单个查询中获得这个结果.如果你有任何提示,我将不胜感激.

如果可以对解决方案进行泛化,以便可以创建任意数量的批处理,那将是最好的.它们的大小不必完全相同,在记录总数不均匀地划分为批大小的情况下,它们的长度可能相差一.

推荐答案

下面是一个使用窗口函数的解决方案示例.

SELECT  id, value, (rownum+2) % 3 AS helper
FROM (
  SELECT id, value,
    ROW_NUMBER() OVER (ORDER BY value DESC) AS rownum
  FROM mytable
) AS t
ORDER BY helper, value DESC;

Dbfiddle

窗口函数是MySQL8.0中一个有趣而强大的新功能.我建议阅读手册的整个部分:https://dev.mysql.com/doc/refman/8.0/en/window-functions.html

Mysql相关问答推荐

更新MySQL表中子记录的序号

一次又一次地删除事件行

我需要为用户提供MySQL视图和存储的 routine ,但不是基础表

优化使用ORDER BY加载耗时较长的MySQL请求

如何使用GROUP BY调优简单SQL查询

MySQL 8.0.33 Select json列时出现错误:排序内存不足,请考虑增加服务器排序缓冲区大小

将时间戳四舍五入到最接近的半小时而不遗漏丢失的数据

Next-key lock explication - 范围的主键

即使使用索引,MySQL 计数和按查询分组也很慢

MYSQL:如何根据之前的相关记录获取记录

包含 group_contact 的视图的问题

Laravel 查询构建器 where() 用于何时产品必须有多个标签(使用 product_tags 数据透视表多对多)

JOOQ:如何将 POJO 列序列化为 JSON

从终端访问 MAMP 的 MySQL

如何使用 phpmyadmin 复制数据库?

MySQL 整数与日期时间索引

错误:无法构建 gem 本机扩展(rails 3.2.3 上的 mysql2)

如何将本地托管的 MySQL 数据库与 docker 容器连接

数据截断:第 1 行的logo列数据太长

MySQL 错误 2014 的原因在其他无缓冲查询处于活动状态时无法执行查询