我在table下面
1.表_车辆
| 视频|帐户标识|压板编号|
| - ------|- ------|- ------|
| 1个|1个|VD101|
| 第二章|1个|VD102|
1.表状态历史
| 身份证|视频|帐户标识|日期_在线|日期_离线|
| - ------|- ------|- ------|- ------|- ------|
| 1个|1个|1个|二〇二三年二月二十五日|0000年00月00日|
| 第二章|1个|1个|0000年00月00日|二〇二三年二月二十六日|
| 三个|第二章|1个|0000年00月00日|二〇二三年二月二十七日|
| 四个|第二章|1个|0000年00月00日|二〇二三年二月二十八日|
| 五个|1个|1个|0000年00月00日|二○二三年三月一日|
| 六个|1个|1个|二○二三年三月二日|0000年00月00日|
现在,我需要对vid进行分组并获取它们的最新状态历史记录。例如,在tbl_status_history下的vid:1中。此vid最新状态历史记录是在线的,因此vid 1的结果将是date_online 2023 - 03 - 02。
以下是我的目标结果。
| 身份证|视频|帐户标识|日期_在线|日期_离线|
| - ------|- ------|- ------|- ------|- ------|
| 第二章|1个|1个|二○二三年三月二日|0000年00月00日|
| 四个|第二章|1个|0000年00月00日|二〇二三年二月二十八日|
我使用了@nnichols的代码,并将其更新为下面的代码,以获得最新的在线日期,但仍然没有解决如何排序两个日期(在线和离线)之前的组
SELECT h.id, h.vid, h.accnt_id, h.date_online, h.date_offline, v.platenumber
FROM tbl_status_history h
JOIN (
SELECT vid, MAX(date_offline) max_date_offline, MAX(date_online) max_date_online
FROM tbl_status_history
GROUP BY vid
) h2 ON h.vid = h2.vid AND h.date_offline = h2.max_date_offline and h.date_online = h2.max_date_online
JOIN tbl_vehicles v ON h.vid = v.vid and h.accnt_id = 1;
1条答案
按热度按时间3j86kqsm1#
这是使用ROW_NUMBER()生成 "目标结果" 的一种方法:
或者,MySQL 8之前的方法:
您应该考虑将
tbl_status_history
的结构更改为:| 身份证|视频|地位|日期|
| - ------|- ------|- ------|- ------|
| 1个|1个|线上|二〇二三年二月二十五日|
| 第二章|1个|离线|二〇二三年二月二十六日|
| 三个|第二章|离线|二〇二三年二月二十七日|
| 四个|第二章|离线|二〇二三年二月二十八日|
| 五个|1个|离线|二○二三年三月一日|
| 六个|1个|线上|二○二三年三月二日|
accnt_id
在tbl_vehicles
中,它属于那里,因此在这里是多余的DATE
列存储一个status change date
没有意义id
,而使用自然键,位我可能不会这么做