在 SQL 的日期中查找 "interruption"

Find "interruption" in dates with SQL

我有一个 table 字段:VALID_FROM - VALID_UP - CLIENT

假设

 2005 - 2006 - Smith
 2006 - 2009 - Smith
 2010 - 2013 - Smith
 2013 - 2014 - Smith
 2015 - 2016 - Smith
 2016 - 2017 - Smith
 2017 - today - Smith
 2014 - today - Bob 

我要找的是中断后的开始日期。在这种情况下:

2015 - 2016 - Smith
2014 - today - Bob

我可能有数百个条目 - 我总是需要第一个中断,从今天开始。

我有没有机会在 (Oracle) 中做到这一点 SQL?

此处的一种方法是使用 LAG() 分析函数为每个客户检查每一行的中断日期。然后,对其进行子查询以仅限于最近的中断。很难用文字解释下面的查询,但如果你 运行 每一个部分,从最里面的子查询开始并向外构建,它应该对你有意义。

SELECT
    t.VALID_FROM,
    t.VALID_UP,
    t.CLIENT
FROM
(
    SELECT t.*,
        ROW_NUMBER() OVER (PARTITION BY CLIENT ORDER BY VALID_FROM DESC) rn
    FROM
    (
        SELECT t.*,
            LAG(VALID_UP) OVER (PARTITION BY CLIENT ORDER BY VALID_FROM) v_lag
        FROM yourTable t
    ) t
    WHERE t.VALID_FROM <> COALESCE(t.v_lag, -1)
) t
WHERE t.rn = 1;

输出:

我似乎永远无法让 Rextester 为 Oracle 工作,但我确实设法让一个演示为 SQL 服务器工作:

Demo