我有一个充满数据的表,如下所示:
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
分组的所有记录,然后是“结束”。 >
答案 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;