mysql 需要从在线和离线日期历史记录中按车辆ID分组,并获得最新的历史日期

uqjltbpv  于 2023-03-07  发布在  Mysql
关注(0)|答案(1)|浏览(92)

我在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;
3j86kqsm

3j86kqsm1#

这是使用ROW_NUMBER()生成 "目标结果" 的一种方法:

SELECT h.id, h.vid, h.accnt_id, h.date_online, h.date_offline, v.platenumber
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY vid ORDER BY GREATEST(date_online, date_offline) DESC) rn
    FROM tbl_status_history
    WHERE accnt_id = 1
) h
JOIN tbl_vehicles v ON h.vid = v.vid
WHERE h.rn = 1;

或者,MySQL 8之前的方法:

SELECT h.id, h.vid, h.accnt_id, h.date_online, h.date_offline, v.platenumber
FROM tbl_status_history h
JOIN (
    SELECT vid, GREATEST(MAX(date_offline), MAX(date_online)) max_date
    FROM tbl_status_history
    WHERE accnt_id = 1
    GROUP BY vid
) h2 ON h.vid = h2.vid AND (h.date_offline = h2.max_date OR h.date_online = h2.max_date)
JOIN tbl_vehicles v ON h.vid = v.vid;

您应该考虑将tbl_status_history的结构更改为:
| 身份证|视频|地位|日期|
| - ------|- ------|- ------|- ------|
| 1个|1个|线上|二〇二三年二月二十五日|
| 第二章|1个|离线|二〇二三年二月二十六日|
| 三个|第二章|离线|二〇二三年二月二十七日|
| 四个|第二章|离线|二〇二三年二月二十八日|
| 五个|1个|离线|二○二三年三月一日|
| 六个|1个|线上|二○二三年三月二日|

  • accnt_idtbl_vehicles中,它属于那里,因此在这里是多余的
  • 两个DATE列存储一个status change date没有意义
  • 你也可以去掉id,而使用自然键,位我可能不会这么做

相关问题