如何从 table 获取特定日期的结果过滤并将其与其他 table 与给定日期其他 table 的最新时间戳对齐?
How to get result filtering on a particular date from a table and aligning it with other table with latest timestamp from other table on a given day?
我正在使用下面的查询来获取我在下面 table 中显示的结果。我希望修改查询以获得预期的结果,如最后 table 所示。我想将最新的时间戳 (start_time) 与 manufacture_date(字符串)对齐。此外,如果 Vehicles table 中的“manufacture_date”在 modem_auth table 中没有任何结果,则 lifecycle_mode、auth_status、start_time, end_time 列应该在结果中显示 NULL。基本上我想显示车辆 table.
的所有记录
SELECT v.vin,
date_Format(v.manufacture_date, 'yyyy-MM-dd') AS event_date,
"Vehicle Manufactured" AS event_desc,
m.lifecycle_mode,
m.auth_status,
m.start_time,
m.end_time
FROM vehicles v
INNER JOIN (SELECT vin, MAX(created_on) AS max_created_on FROM vehicles GROUP BY vin) v2
ON v.vin = v2.vin AND
v.created_on = v2.max_created_on
LEFT JOIN modem_auth m
ON v.vin = m.vin AND
(date_Format(v.manufacture_date, 'yyyy-MM-dd') BETWEEN TO_DATE(m.start_time) AND TO_DATE(m.end_time)) AND
save.vin_2 IN ('LMN12345', 'XYZ12345', 'ABC12345')
WHERE m.partition_region = 'NA' AND
m.partition_country = 'USA'
我得到的结果 -
vin
event_date
event_desc
lifecycle_mode
auth_status
start_time
end_time
LMN12345
8/2/2021
Vehicle Manufactured
NULL
WAITING_FOR_AUTH
08/02/2021 16:35:15
09/02/2021 13:28:29
XYZ12345
11/12/2020
Vehicle Manufactured
NORMAL
NOT_AUTHORIZED
11/10/2020 05:09:44
11/12/2020 16:19:53
XYZ12345
11/12/2020
Vehicle Manufactured
NORMAL
NOT_AUTHORIZED
11/12/2020 16:19:53
06/12/2021 00:00:30
ABC12345
6/13/2019
Vehicle Manufactured
NULL
UNPROVISIONED
06/13/2019 21:20:42
06/13/2019 21:20:58
ABC12345
6/13/2019
Vehicle Manufactured
NULL
WAITING_FOR_HOME_URL
06/13/2019 21:20:58
06/13/2019 22:10:32
ABC12345
6/14/2019
Vehicle Manufactured
NULL
WAITING_FOR_USER
06/13/2019 22:10:32
11/01/2019 12:18:32
预期结果 -
vin
event_date
event_desc
lifecycle_mode
auth_status
start_time
end_time
LMN12345
8/2/2021
Vehicle Manufactured
NULL
WAITING_FOR_AUTH
08/02/2021 16:35:15
09/02/2021 13:28:29
XYZ12345
11/12/2020
Vehicle Manufactured
NORMAL
NOT_AUTHORIZED
11/12/2020 16:19:53
06/12/2021 00:00:30
ABC12345
6/14/2019
Vehicle Manufactured
NULL
WAITING_FOR_USER
06/13/2019 22:10:32
11/01/2019 12:18:32
问题是对于单个 vin,您有多个行来自 table m (modem_auth)。您需要将来自 m 的行减少到每个 vin 最多一行,这意味着您需要从中创建一个包含 group by vin
子句的 table 表达式。 (我对第一个 table 中的 event_date 列有点困惑,就好像 vin 是车辆的主键一样,对于与 [=23] 相同的 vin,你不会有两个不同的日期=] 显示 ABC12345。)
您需要做的是基于 modem_auth 创建一个 table 表达式,该表达式标识您要在车辆外部连接中使用的每个 vin 的一行,该行就是最新 start_time。所以替换
LEFT JOIN modem_auth m
ON v.vin = m.vin AND
(date_Format(v.manufacture_date, 'yyyy-MM-dd') BETWEEN TO_DATE(m.start_time) AND TO_DATE(m.end_time))
与
LEFT JOIN modem_auth m
INNER JOIN (select ma2.vin, max(ma2.start_time) AS start_time from modem_auth ma2
INNER JOIN vehicles v2 ON v2.vin = ma2.vin
AND date_Format(v2.manufacture_date, 'yyyy-MM-dd') BETWEEN
TO_DATE(ma2.start_time) AND TO_DATE(ma2.end_time)
group by ma2.vin) mamax ON m.vin = mamax.vin AND m.start_time = mamax.start_time
ON v.vin = m.vin AND
(date_Format(v.manufacture_date, 'yyyy-MM-dd') BETWEEN TO_DATE(m.start_time) AND TO_DATE(m.end_time))
我正在使用下面的查询来获取我在下面 table 中显示的结果。我希望修改查询以获得预期的结果,如最后 table 所示。我想将最新的时间戳 (start_time) 与 manufacture_date(字符串)对齐。此外,如果 Vehicles table 中的“manufacture_date”在 modem_auth table 中没有任何结果,则 lifecycle_mode、auth_status、start_time, end_time 列应该在结果中显示 NULL。基本上我想显示车辆 table.
的所有记录 SELECT v.vin,
date_Format(v.manufacture_date, 'yyyy-MM-dd') AS event_date,
"Vehicle Manufactured" AS event_desc,
m.lifecycle_mode,
m.auth_status,
m.start_time,
m.end_time
FROM vehicles v
INNER JOIN (SELECT vin, MAX(created_on) AS max_created_on FROM vehicles GROUP BY vin) v2
ON v.vin = v2.vin AND
v.created_on = v2.max_created_on
LEFT JOIN modem_auth m
ON v.vin = m.vin AND
(date_Format(v.manufacture_date, 'yyyy-MM-dd') BETWEEN TO_DATE(m.start_time) AND TO_DATE(m.end_time)) AND
save.vin_2 IN ('LMN12345', 'XYZ12345', 'ABC12345')
WHERE m.partition_region = 'NA' AND
m.partition_country = 'USA'
我得到的结果 -
vin | event_date | event_desc | lifecycle_mode | auth_status | start_time | end_time |
---|---|---|---|---|---|---|
LMN12345 | 8/2/2021 | Vehicle Manufactured | NULL | WAITING_FOR_AUTH | 08/02/2021 16:35:15 | 09/02/2021 13:28:29 |
XYZ12345 | 11/12/2020 | Vehicle Manufactured | NORMAL | NOT_AUTHORIZED | 11/10/2020 05:09:44 | 11/12/2020 16:19:53 |
XYZ12345 | 11/12/2020 | Vehicle Manufactured | NORMAL | NOT_AUTHORIZED | 11/12/2020 16:19:53 | 06/12/2021 00:00:30 |
ABC12345 | 6/13/2019 | Vehicle Manufactured | NULL | UNPROVISIONED | 06/13/2019 21:20:42 | 06/13/2019 21:20:58 |
ABC12345 | 6/13/2019 | Vehicle Manufactured | NULL | WAITING_FOR_HOME_URL | 06/13/2019 21:20:58 | 06/13/2019 22:10:32 |
ABC12345 | 6/14/2019 | Vehicle Manufactured | NULL | WAITING_FOR_USER | 06/13/2019 22:10:32 | 11/01/2019 12:18:32 |
预期结果 -
vin | event_date | event_desc | lifecycle_mode | auth_status | start_time | end_time |
---|---|---|---|---|---|---|
LMN12345 | 8/2/2021 | Vehicle Manufactured | NULL | WAITING_FOR_AUTH | 08/02/2021 16:35:15 | 09/02/2021 13:28:29 |
XYZ12345 | 11/12/2020 | Vehicle Manufactured | NORMAL | NOT_AUTHORIZED | 11/12/2020 16:19:53 | 06/12/2021 00:00:30 |
ABC12345 | 6/14/2019 | Vehicle Manufactured | NULL | WAITING_FOR_USER | 06/13/2019 22:10:32 | 11/01/2019 12:18:32 |
问题是对于单个 vin,您有多个行来自 table m (modem_auth)。您需要将来自 m 的行减少到每个 vin 最多一行,这意味着您需要从中创建一个包含 group by vin
子句的 table 表达式。 (我对第一个 table 中的 event_date 列有点困惑,就好像 vin 是车辆的主键一样,对于与 [=23] 相同的 vin,你不会有两个不同的日期=] 显示 ABC12345。)
您需要做的是基于 modem_auth 创建一个 table 表达式,该表达式标识您要在车辆外部连接中使用的每个 vin 的一行,该行就是最新 start_time。所以替换
LEFT JOIN modem_auth m
ON v.vin = m.vin AND
(date_Format(v.manufacture_date, 'yyyy-MM-dd') BETWEEN TO_DATE(m.start_time) AND TO_DATE(m.end_time))
与
LEFT JOIN modem_auth m
INNER JOIN (select ma2.vin, max(ma2.start_time) AS start_time from modem_auth ma2
INNER JOIN vehicles v2 ON v2.vin = ma2.vin
AND date_Format(v2.manufacture_date, 'yyyy-MM-dd') BETWEEN
TO_DATE(ma2.start_time) AND TO_DATE(ma2.end_time)
group by ma2.vin) mamax ON m.vin = mamax.vin AND m.start_time = mamax.start_time
ON v.vin = m.vin AND
(date_Format(v.manufacture_date, 'yyyy-MM-dd') BETWEEN TO_DATE(m.start_time) AND TO_DATE(m.end_time))