我在这里看到了一些精彩的答案,我需要修复。我还不想创建表或 ETL,我希望创建一个简单的数据库视图,用户可以先访问以进行测试。
表有 item#、item_ticket_color#、maint_date 和其他列 tick_col 有时会更新,但表中的其他列也会更新。如果某些其他列被更新或更改,则 tick_col 迭代。我需要过滤这些数据以获得以下预期结果,并且需要一些帮助来试图弄清楚我可以如何做到这一点。如果可能的话,我正在寻找直接的 SQL
ITEM......................TICK_COL................. MAINT_DATE
21524804....................RIBG...................1/1/0001
21524804....................RIBG...................6/15/2008 6:52:57 AM
21524804....................RIBG...................6/25/2008 11:31:03 AM
21524804....................RIBG...................6/28/2008 4:12:21 AM
21524804....................RIWH...................9/20/2008 6:36:24 AM
21524804....................RIGR...................9/23/2008 6:36:44 AM
21524804....................RIGR...................9/30/2008 6:37:42 AM
21524804....................RIWH...................10/31/2008 6:37:27 AM
21524804....................RIWH...................11/1/2008 6:36:41 AM
21524804....................RIGR...................3/11/2009 6:01:43 PM
21524804....................RIGR...................7/28/2009 6:37:11 AM
21524804....................RIGR...................10/8/2009 6:37:00 AM
21524804....................RIBS...................11/20/2009 6:37:58 AM
21524804....................RIBS...................5/18/2010 6:37:07 AM
21524804....................RIBS...................9/16/2010 6:38:11 AM
21524804....................RIBS...................8/13/2012 10:39:44 AM
21524804....................RIBS...................3/12/2013 6:46:08 AM
21524804....................RIBS...................3/17/2013 9:25:31 AM
21524804....................RIBS...................3/27/2013 6:52:57 AM
21524804....................RIBS...................7/25/2013 6:41:51 AM
我希望在下面看到这一点,它显示了票证颜色发生变化的每个场景的开始和结束日期。:
21524804.....RIBG.....10101........20080919
21524804.....RIWH.....20080920.....20080922
21524804.....RIGR.....20080923.....20081030
21524804.....RIWH.....20081031.....20090310
21524804.....RIGR.....20090311.....20091119
21524804.....RIBS.....20091120.....20130725
这是新代码,基于 Jasti 的贡献,我做了一些额外的更改,但这正是我想要的
SELECT item,
tick_col,
from_dt,
CASE
WHEN LEAD (from_dt) OVER (PARTITION BY item ORDER BY from_dt) - 1
IS NULL
THEN
SYSDATE
ELSE
LEAD (from_dt) OVER (PARTITION BY item ORDER BY from_dt) - 1
END
TO_DATE
FROM ( SELECT ITEM,
TICK_COL,
MIN (MAINT_DATE) AS from_dt,
MAX (MAINT_DATE) AS to_dt
FROM (SELECT SUM (start_of_group) OVER (ORDER BY maint_date) AS sm,
ITEM,
TICK_COL,
maint_date
FROM (SELECT ITEM,
TICK_COL,
maint_date,
CASE
WHEN LAG (TICK_COL, 1, TICK_COL)
OVER (ORDER BY maint_date) =
TICK_COL
THEN
0
ELSE
1
END
start_of_group
FROM mytable))
GROUP BY ITEM, TICK_COL, sm
ORDER BY sm)