【问题标题】:How do I join two columns where date from Table A falls in between date from Table B in Oracle SQL (Part 2)?如何在 Oracle SQL(第 2 部分)中将表 A 中的日期介于表 B 中的日期之间的两列连接起来?
【发布时间】:2020-07-20 01:28:48
【问题描述】:

这个问题是对我之前写的问题的修改:

How do I join two columns where date from Table A falls in between date from Table B in Oracle SQL?

@GordonLinoff 帮助我满意地回答了这个问题。

现在,我需要帮助来解决之前的问题。对上一题的修改是我在表A中多了两行:分别对应Joe Bryant和Jennifer Smith的行。

结果,我有以下两个表表A和表B:

表 A:

+-----------------+--------------+---------------+-------------+
|      Date       |     Car      | License_Plate |    Owner    |
+-----------------+--------------+---------------+-------------+
| 1/1/2020 11:51  | Ford F150    | 3892A84       | John Doe    |
| 2/2/2020 12:43  | Ford F150    | 3892A84       | Jane Doe    |
| 3/21/2020 8:14  | Ford F150    | 3892A84       | John Smith  |
| 6/2/2020 13:59  | Ford F150    | 3892A84       | Joe Bryant  |
| 1/1/2019 10:27  | Toyota Camry | 894A839       | Adam Baker  |
| 7/3/2019 13:39  | Toyota Camry | 894A839       | Clark Davis |
| 9/24/2019 16:48 | Toyota Camry | 894A839       | Frank Evans |
| 2/14/2020 19:53 | Toyota Camry | 894A839       | William Johnson |
| 5/22/2020 9:44  | Toyota Camry | 894A839       | Jennifer Smith |
+-----------------+--------------+---------------+-------------+

表 B:

+------------------+---------------+-----------------------------+
|       Date       | License_Plate | Maintenance_Service_Mileage |
+------------------+---------------+-----------------------------+
| 1/14/2020 14:07  | 3892A84       | 5000 miles                  |
| 1/30/2020 17:14  | 3892A84       | 10000 miles                 |
| 2/11/2020 11:45  | 3892A84       | 15000 miles                 |
| 2/28/2020 13:36  | 3892A84       | 20000 miles                 |
| 3/4/2020 15:32   | 3892A84       | 25000 miles                 |
| 3/31/2020 10:24  | 3892A84       | 30000 miles                 |
| 4/16/2020 16:01  | 3892A84       | 35000 miles                 |
| 5/18/2020 14:14  | 3892A84       | 40000 miles                 |
| 1/25/2019 13:11  | 894A839       | 5000 miles                  |
| 6/27/2019 12:44  | 894A839       | 10000 miles                 |
| 9/1/2019 16:17   | 894A839       | 15000 miles                 |
| 10/31/2019 8:59  | 894A839       | 20000 miles                 |
| 11/22/2019 10:55 | 894A839       | 25000 miles                 |
| 12/19/2019 15:41 | 894A839       | 30000 miles                 |
| 1/2/2020 14:22   | 894A839       | 35000 miles                 |
| 2/13/2020 17:42  | 894A839       | 40000 miles                 |
| 3/7/2020 9:14    | 894A839       | 45000 miles                 |
| 4/13/2020 9:58   | 894A839       | 50000 miles                 |
+------------------+---------------+-----------------------------+

我想通过License_Plate 加入这两个表,使表 A 中的日期和表 B 中的日期符合以下条件:

  1. Date 在表 A Date 在表 B
  2. 表 B 中的 Date 连接到表 A 中符合标准 1 的最大可能日期
  3. 如果表 A 中的行在表 B 中没有匹配的行,则表 A 中的行应与表 B 中具有最大 Date 的行连接,同时仍通过 License_Plate 连接。

结果表如下:

结果表:

+-----------------+--------------+-----------------+------------------+---------------+-----------------------------+
|   Owner_Date    |     Car      |      Owner      |   Service_Date   | License_Plate | Maintenance_Service_Mileage |
+-----------------+--------------+-----------------+------------------+---------------+-----------------------------+
| 1/1/2020 11:51  | Ford F150    | John Doe        | 1/14/2020 14:07  | 3892A84       | 5000 miles                  |
| 1/1/2020 11:51  | Ford F150    | John Doe        | 1/30/2020 17:14  | 3892A84       | 10000 miles                 |
| 2/2/2020 12:43  | Ford F150    | Jane Doe        | 2/11/2020 11:45  | 3892A84       | 15000 miles                 |
| 2/2/2020 12:43  | Ford F150    | Jane Doe        | 2/28/2020 13:36  | 3892A84       | 20000 miles                 |
| 2/2/2020 12:43  | Ford F150    | Jane Doe        | 3/4/2020 15:32   | 3892A84       | 25000 miles                 |
| 3/21/2020 8:14  | Ford F150    | John Smith      | 3/31/2020 10:24  | 3892A84       | 30000 miles                 |
| 3/21/2020 8:14  | Ford F150    | John Smith      | 4/16/2020 16:01  | 3892A84       | 35000 miles                 |
| 3/21/2020 8:14  | Ford F150    | John Smith      | 5/18/2020 14:14  | 3892A84       | 40000 miles                 |
| 6/2/2020 13:59  | Ford F150    | Joe Bryant      | 5/18/2020 14:14  | 3892A84       | 40000 miles                 |
| 1/1/2019 10:27  | Toyota Camry | Adam Baker      | 1/25/2019 13:11  | 894A839       | 5000 miles                  |
| 1/1/2019 10:27  | Toyota Camry | Adam Baker      | 6/27/2019 12:44  | 894A839       | 10000 miles                 |
| 7/3/2019 13:39  | Toyota Camry | Clark Davis     | 9/1/2019 16:17   | 894A839       | 15000 miles                 |
| 9/24/2019 16:48 | Toyota Camry | Frank Evans     | 10/31/2019 8:59  | 894A839       | 20000 miles                 |
| 9/24/2019 16:48 | Toyota Camry | Frank Evans     | 11/22/2019 10:55 | 894A839       | 25000 miles                 |
| 9/24/2019 16:48 | Toyota Camry | Frank Evans     | 12/19/2019 15:41 | 894A839       | 30000 miles                 |
| 9/24/2019 16:48 | Toyota Camry | Frank Evans     | 1/2/2020 14:22   | 894A839       | 35000 miles                 |
| 9/24/2019 16:48 | Toyota Camry | Frank Evans     | 2/13/2020 17:42  | 894A839       | 40000 miles                 |
| 2/14/2020 19:53 | Toyota Camry | William Johnson | 3/7/2020 9:14    | 894A839       | 45000 miles                 |
| 2/14/2020 19:53 | Toyota Camry | William Johnson | 4/13/2020 9:58   | 894A839       | 50000 miles                 |
| 5/22/2020 9:44  | Toyota Camry | Jennifer Smith  | 4/13/2020 9:58   | 894A839       | 50000 miles                 |
+-----------------+--------------+-----------------+------------------+---------------+-----------------------------+

谁能告诉我如何在 Oracle SQL 中做到这一点?

任何帮助将不胜感激!

【问题讨论】:

    标签: oracle


    【解决方案1】:

    请看这个:

    with a as (
                select '1/1/2020 11:51' as date_a,  'Ford F150' as car,     '3892A84' as license_plate, 'John Doe' as name from dual
                union
                select '2/2/2020 12:43' as date_a,  'Ford F150' as car,     '3892A84' as license_plate, 'Jane Doe'       from dual
                union
                select '3/21/2020 8:14' as date_a,  'Ford F150' as car,     '3892A84' as license_plate, 'John Smith'     from dual
                union
                select '6/2/2020 13:59' as date_a,  'Ford F150' as car,     '3892A84' as license_plate, 'Joe Bryant'     from dual
                union
                select '1/1/2019 10:27' as date_a,  'Toyota Camry' as car, '894A839' as license_plate, 'Adam Baker'      from dual
                union
                select '7/3/2019 13:39' as date_a,  'Toyota Camry' as car, '894A839' as license_plate, 'Clark Davis'     from dual
                union
                select '9/24/2019 16:48' as date_a, 'Toyota Camry' as car, '894A839' as license_plate, 'Frank Evans'     from dual
                union
                select '2/14/2020 19:53' as date_a, 'Toyota Camry' as car, '894A839' as license_plate, 'William Johnson' from dual
                union
                select '5/22/2020 9:44' as date_a,  'Toyota Camry' as car, '894A839' as license_plate, 'Jennifer Smith'  from dual
                    )
            ,b as(
                select '1/14/2020 14:07 ' as date_b,'3892A84' as License_plate, '5000 miles ' as maintence_service_mile from dual union
                select '1/30/2020 17:14 ' as date_b,'3892A84' as License_plate, '10000 miles' as maintence_service_mile from dual union
                select '2/11/2020 11:45 ' as date_b,'3892A84' as License_plate, '15000 miles' as maintence_service_mile from dual union
                select '2/28/2020 13:36 ' as date_b,'3892A84' as License_plate, '20000 miles' as maintence_service_mile from dual union
                select '3/4/2020 15:32  ' as date_b,'3892A84' as License_plate, '25000 miles' as maintence_service_mile from dual union
                select '3/31/2020 10:24 ' as date_b,'3892A84' as License_plate, '30000 miles' as maintence_service_mile from dual union
                select '4/16/2020 16:01 ' as date_b,'3892A84' as License_plate, '35000 miles' as maintence_service_mile from dual union
                select '5/18/2020 14:14 ' as date_b,'3892A84' as License_plate, '40000 miles' as maintence_service_mile from dual union
                select '1/25/2019 13:11 ' as date_b,'894A839' as License_plate, '5000 miles ' as maintence_service_mile from dual union
                select '6/27/2019 12:44 ' as date_b,'894A839' as License_plate, '10000 miles' as maintence_service_mile from dual union
                select '9/1/2019 16:17  ' as date_b,'894A839' as License_plate, '15000 miles' as maintence_service_mile from dual union
                select '10/31/2019 8:59 ' as date_b,'894A839' as License_plate, '20000 miles' as maintence_service_mile from dual union
                select '11/22/2019 10:55' as date_b,'894A839' as License_plate, '25000 miles' as maintence_service_mile from dual union
                select '12/19/2019 15:41' as date_b,'894A839' as License_plate, '30000 miles' as maintence_service_mile from dual union
                select '1/2/2020 14:22  ' as date_b,'894A839' as License_plate, '35000 miles' as maintence_service_mile from dual union
                select '2/13/2020 17:42 ' as date_b,'894A839' as License_plate, '40000 miles' as maintence_service_mile from dual union
                select '3/7/2020 9:14   ' as date_b,'894A839' as License_plate, '45000 miles' as maintence_service_mile from dual union
                select '4/13/2020 9:58  ' as date_b,'894A839' as License_plate, '50000 miles' as maintence_service_mile from dual
            
                )
                    SELECT subq.date_a AS OWNER_DATE,subq.CAR AS CAR,NAME AS OWNER,B.date_B AS SERVICE_DATE,B.LICENSE_PLATE,b.maintence_service_mile FROM(
                    SELECT LICENSE_PLATE,name,CAR,date_a FROM(
                    SELECT LICENSE_PLATE,name,CAR,a.date_a,ROW_NUMBER() OVER (PARTITION BY name,LICENSE_PLATE ORDER BY to_date(a.date_a,'MM/DD/YYYY HH24:MI')) AS R FROM A )
                    WHERE R=1) SUBQ
                    INNER JOIN B ON b.license_plate = SUBQ.LICENSE_PLATE AND subq.date_a < B.date_B
                    ORDER BY CAR,NAME,to_date(date_a,'MM/DD/YYYY HH24:MI'),b.maintence_service_mile;
    

    我仍然认为您的结果表尚未完成或您要应用的标准不够明确。

    【讨论】:

    • 嘿@KOBER。谢谢你的协助。我注意到您提出的解决方案的结果与我希望的结果不匹配。请让我知道如何澄清问题,以帮助您更好地理解我要解决的问题。
    • 嘿@DanielLee 请继续澄清,一旦我把它或任何其他成员红色,我们可以更好地帮助你
    猜你喜欢
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多