[英]Oracle sql query to return all records between a condition
以下是由start_time排序的表的结果,
START_TIME START_LOCATION_ID END_TIME END_LOCATION_ID
------------------------- -------------- ------------------------- ------------
16/05/2014 12:15:00 am 1 16/05/2014 12:20:00 am 2
16/05/2014 12:25:00 am 2 16/05/2014 12:30:00 am 3
16/05/2014 12:35:00 am 3 16/05/2014 12:40:00 am 1
16/05/2014 12:45:00 am 1 16/05/2014 12:50:00 am 6
16/05/2014 12:55:00 am 6 16/05/2014 01:00:00 am 7
16/05/2014 01:05:00 am 7 16/05/2014 01:10:00 am 1
16/05/2014 01:15:00 am 1 16/05/2014 01:20:00 am 2
16/05/2014 01:25:00 am 2 16/05/2014 01:30:00 am 4
16/05/2014 01:35:00 am 4 16/05/2014 01:40:00 am 3
16/05/2014 01:45:00 am 3 16/05/2014 01:50:00 am 1
如果输入指定为start_location_id = 1和end_location_id = 3,我需要过滤输出,如下所示。
START_TIME START_LOCATION_ID END_TIME END_LOCATION_ID
------------------------- -------------- ------------------------- ------------
16/05/2014 12:15:00 am 1 16/05/2014 12:20:00 am 2
16/05/2014 12:25:00 am 2 16/05/2014 12:30:00 am 3
16/05/2014 01:15:00 am 1 16/05/2014 01:20:00 am 2
16/05/2014 01:25:00 am 2 16/05/2014 01:30:00 am 4
16/05/2014 01:35:00 am 4 16/05/2014 01:40:00 am 3
我不知道如何开始查询,因为我知道条件'WHERE start_location_id = 1和end_location_id = 3'无法正常工作。
图片预览>> 在这里 <<
请帮助,并提前致谢。
这个答案太长了,无法发表评论。 您的要求对我来说似乎很难。 该解决方案将需要递归CTE(或connect
子句)。 您应该在互联网上浏览示例。 这是一个起点。 或在这里 (如果您熟悉connect
)。 还是这里 。
如果我理解正确,那么您的特定问题比其他问题难解决。 部分原因是因为问题未明确指出。 在您的示例中,要从1-> 3获得的解决方案不止两个。 例如,对于1-> 2-> 4-> 3,有两条路径。 还有1-> 2-> 3-> 1-> 2-> 4-> 3。
处理这些情况的方式有很大的不同,这就是为什么您需要真正理解所编写的代码的原因。 递归CTE对案例的这种修剪可能是具有挑战性的,但绝对有可能。
如果可以在12c上运行它,请使用模式匹配功能。 这将为您提供所需的结果:
SELECT * FROM tr
MATCH_RECOGNIZE (ORDER BY start_time
ALL ROWS PER MATCH
AFTER MATCH SKIP TO LAST FIN
PATTERN (STRT MID* FIN)
DEFINE
STRT AS STRT.start_location_id = 1,
MID AS MID.start_location_id != 1 AND MID.end_location_id != 3,
FIN AS FIN.end_location_id = 3
);
这是使用解析函数在11g中工作的解决方案:
SELECT start_time, start_location_id, end_time, end_location_id
FROM (SELECT tr_groups.*,
first_value(start_location_id) over (partition by grp order by start_time) strt,
first_value(end_location_id) over (partition by grp order by start_time desc) fin
FROM (SELECT tr.*,
sum(case when start_location_id in (1, 3) then 1 end) over (order by start_time) grp
FROM tr) tr_groups)
WHERE strt = 1 AND fin = 3;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.