MySQL 按两个交替的静态值对记录进行排序

标签 mysql sql

我有一个充满数据的表,如下所示:

ID      datetime            ip_address      marker
289055  2016-11-17 17:54:51 XX.XXX.XXX.XXX  End
289037  2016-11-17 17:54:51 XX.XXX.XXX.XXX  Start
289057  2016-11-17 17:58:56 XX.XXX.XXX.XXX  Start
289123  2016-11-17 17:59:18 XX.XXX.XXX.XXX  End
289184  2016-11-17 18:05:55 XX.XXX.XXX.XXX  End
289125  2016-11-17 18:05:55 XX.XXX.XXX.XXX  Start
289186  2016-11-17 18:12:22 XX.XXX.XXX.XXX  Start
289292  2016-11-17 18:18:44 XX.XXX.XXX.XXX  End

我试图按两个值(“开始”、“结束”)对数据进行排序,但“带状”。我的意思如下:

ID      datetime            ip_address      marker
289037  2016-11-17 17:54:51 XX.XXX.XXX.XXX  Start
289055  2016-11-17 17:54:51 XX.XXX.XXX.XXX  End
289057  2016-11-17 17:58:56 XX.XXX.XXX.XXX  Start
289123  2016-11-17 17:59:18 XX.XXX.XXX.XXX  End
289125  2016-11-17 18:05:55 XX.XXX.XXX.XXX  Start
289184  2016-11-17 18:05:55 XX.XXX.XXX.XXX  End
289186  2016-11-17 18:12:22 XX.XXX.XXX.XXX  Start
289292  2016-11-17 18:18:44 XX.XXX.XXX.XXX  End

请注意 marker 列如何在 Start 和 End 之间旋转(start 始终为第一个,End 始终为最后一个)。我相信我想要完成的事情是可能的,但我不知道如何将这些数据操纵成我想要的。我尝试了一些不同的查询,按不同的列进行分组或排序,但它总是以第一个表的形式结束,或者以“Start”作为标记的所有记录分组在一起,后跟“End” .

最佳答案

在 MySQL 8+ 中,这很简单:

order by row_number() over (partition by marker order by datetime),
         marker desc

这在早期版本的 MySQL 中更具挑战性。

关于MySQL 按两个交替的静态值对记录进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55497520/

相关文章:

PHP内循环不打印MYSQL查询的所有结果

mysql - SQL 按 DATENAME 分组

Mysql "safe"合并

php - 表头从 php 中的 for 循环重复

java - 使用 JDBC 和 c3p0 在 MySQL DB 上进行多线程写入

java - Java 代码中是否可以从 MySQL 客户端运行大权限 SQL?

sql - 从 SQL 查询中仅选择列名

mysql - 选择一个月内和24小时内MySQL的用户状态

sql - 架构中不存在类型 "geometry",但扩展名存在

sql - 使用 db2 在 C 程序中嵌入 SQL