【发布时间】:2019-02-14 09:01:28
【问题描述】:
我在 oracle SQL 数据库中有一个表。
它的列是 VEHICLE_ID、GEAR_ID、STARTDATE、ENDDATE、AA。
开始日期和结束日期表示特定车辆的齿轮有效日期范围。
我的问题是我需要找到同一辆车的相同档位,但日期重叠。
我想出了这个查询
SELECT DISTINCT G.* FROM VEHICLE_GEARS G JOIN (SELECT A.*, B.CNT FROM VEHICLE_GEARS A JOIN
(SELECT VEHICLE_ID, GEAR_ID, COUNT(GEAR_ID) CNT FROM VEHICLE_GEARS GROUP BY
VEHICLE_ID, GEAR_ID HAVING COUNT(GEAR_ID) > 1) B
ON A.VEHICLE_ID = B.VEHICLE_ID AND A.GEAR_ID = B.GEAR_ID) ASDF ON
G.VEHICLE_ID = ASDF.VEHICLE_ID AND G.GEAR_ID = ASDF.GEAR_ID
WHERE
NOT(
TRUNC(ASDF.STARTDATE) >= TRUNC(G.ENDDATE)
OR
TRUNC(ASDF.ENDDATE) <= TRUNC(G.STARTDATE)
)
ORDER BY 1, 5
问题在于,这考虑到即使齿轮的结束日期与齿轮的开始日期相同的日期也会重叠,这是我不想要的,但即使从 where 子句中删除相等性,结果也是相同的。
请帮忙,提前谢谢。
编辑: 样本数据(经过上述查询):
000000006 2012-02-20 00:00:00 3 2999-12-31 00:00:00 804
000000006 1991-07-01 00:00:00 9 2999-12-31 00:00:00 804
000000147 1991-07-01 00:00:00 1 1992-10-08 00:00:00 601
000000147 1992-10-08 00:00:00 2 2999-12-31 00:00:00 601
预期的是,车辆 000000147 不应出现在结果集中,因为齿轮 601 的结束日期与其第二个“实例”的起始日期相同。 前两条记录(车辆 00000006)是正确的,因为档位 804 的日期重叠。
样本表数据:
000000000 2014-02-25 00:00:00 1 2999-12-31 00:00:00 302
000000000 2006-12-15 00:00:00 3 2999-12-31 00:00:00 604
000000000 2006-12-15 00:00:00 4 2999-12-31 00:00:00 605
000000006 1991-07-01 00:00:00 1 2999-12-31 00:00:00 601
000000006 2016-01-18 00:00:00 10 2999-12-31 00:00:00 605
000000006 2012-02-20 00:00:00 3 2999-12-31 00:00:00 804
000000006 1991-07-01 00:00:00 9 2999-12-31 00:00:00 804
000000147 1991-07-01 00:00:00 1 1992-10-08 00:00:00 601
000000147 1992-10-08 00:00:00 2 2999-12-31 00:00:00 601
预期结果:
000000000 2006-12-15 00:00:00 4 2999-12-31 00:00:00 605
000000006 2016-01-18 00:00:00 10 2999-12-31 00:00:00 605
【问题讨论】:
-
轻松为您提供帮助:stackoverflow.com/help/mcve
-
还需要什么?我的问题还不清楚吗?
-
一些示例表数据和预期结果。 (作为格式化文本,而不是图像。)