在 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 服务器工作:
我有一个 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 服务器工作: