如何从 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))