繁体   English   中英

Oracle SQL查询返回条件之间的所有记录

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM