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

时间:2019-04-03 14:25:10

标签: 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列如何在“开始”和“结束”之间旋转(开始始终为第一,结束始终为最后)。我相信我想完成的事情是可能的,但是我没有掌握如何将这些数据转换为我想要的东西。我已经尝试过按照不同的列对一些不同的查询进行分组或排序,但是它总是以第一个表的形式结束,或者以“开始”作为marker分组的所有记录,然后是“结束”。 >

2 个答案:

答案 0 :(得分:2)

在MySQL 8+中,这很容易:

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

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

答案 1 :(得分:0)

我可以建议在您的SELECT...中添加一些内容,以用于您的订购。例如:

SELECT ID,datetime,ip_address,marker,
CASE WHEN marker='Start' THEN 1 WHEN marker='End' THEN 2 END AS 'mcheck'
FROM table
ORDER BY datetime,ipaddress,mcheck;