完全忽略你的状态栏;只是依靠行之间的时间间隔。
在此期间看到了您的编辑。这样,您还可以检查 LAG(status) OVER() IS NULL OR LAG(status) OVER() = 0 以进行计数器的计算。
请,请 - 添加您的数据,以便我们可以将它们复制粘贴到工作空间中,而不是耐心地用手敲击它们...
哦 - 我假设(因为我手边没有 SAP HANA) - 在 SAP HANA 中也返回一个整数。否则,请使用 DAYS_BETWEEN() ...
WITH
-- your input as table "indata"
indata(emp_id,dt_from,dt_to,status) AS (
SELECT 1,DATE '2000-01-01',DATE '2000-03-01',1
UNION ALL SELECT 1,DATE '2000-03-02',DATE '2000-06-25',1
UNION ALL SELECT 1,DATE '2000-06-26',DATE '2002-03-25',1
UNION ALL SELECT 1,DATE '2002-03-26',DATE '2002-05-10',1
UNION ALL SELECT 1,DATE '2005-02-15',DATE '2005-07-01',1
UNION ALL SELECT 1,DATE '2005-07-02',DATE '2005-09-03',1
UNION ALL SELECT 1,DATE '2005-09-04',DATE '2006-02-11',1
UNION ALL SELECT 2,DATE '2000-08-02',DATE '2000-11-20',1
UNION ALL SELECT 2,DATE '2000-11-21',DATE '2001-08-12',1
UNION ALL SELECT 2,DATE '2001-08-13',DATE '2002-02-15',1
)
-- ignore existing "status"; just rely on gaps in the time line;
-- add a counter that is at 0 when first row or no gap to
-- predecessor, else at 1
,
with_counter AS (
SELECT
emp_id
, dt_from
, dt_to
, dt_from - LAG(dt_to) OVER(PARTITION BY emp_id ORDER BY dt_from) as gapsize
, CASE WHEN LAG(dt_to) OVER(PARTITION BY emp_id ORDER BY dt_from) IS NULL
OR dt_from - LAG(dt_to) OVER(PARTITION BY emp_id ORDER BY dt_from) = 1
THEN 0
ELSE 1
END AS counter
FROM indata
)
-- create a session id as running sum previous counter
,
with_session AS (
SELECT
*
, SUM(counter) OVER(PARTITION BY emp_id ORDER BY dt_from) AS sess_id
FROM with_counter
)
SELECT
emp_id
, MIN(dt_from) AS dt_from
, MAX(dt_to) AS dt_to
FROM with_session
GROUP BY
emp_id
, sess_id
ORDER BY
emp_id
, 2
;
-- out emp_id | dt_from | dt_to
-- out --------+------------+------------
-- out 1 | 2000-01-01 | 2002-05-10
-- out 1 | 2005-02-15 | 2006-02-11
-- out 2 | 2000-08-02 | 2002-02-15