日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Oracle數(shù)倉中判斷時間連續(xù)性的幾種SQL寫法示例

瀏覽:303日期:2023-03-12 15:25:32

零、需求介紹

現(xiàn)有一張表數(shù)據(jù)如下:

此表是一張鏡像表,policyno列代表一個保單號,state列代表這個保單號在snapdate當(dāng)天的最后一次狀態(tài)(state每天可能會變很多次,鏡像表只保留snapdate時間點凌晨的最后一次狀態(tài)),snapdate代表當(dāng)天做鏡像的時間,現(xiàn)在有個需求,我們想取出來這個保單號連續(xù)保持某個狀態(tài)的起止時間,例如:

保單號sm1保持狀態(tài)1的起止時間為2021020120210202,然后在20210203時候變成了狀態(tài)2,又在20210204時候變成了狀態(tài)3,最終又在2021020520210209時間段保持在狀態(tài)1,然后鏡像表的程序可能期間出現(xiàn)過問題,在20210210開始到20210215日沒有鏡像成功,直到20210216日才恢復(fù),20210216~20210219日保單號sm1的狀態(tài)一直保持為1,后續(xù)還有可能繼續(xù)變,那么,上面說的保單sm1的幾個狀態(tài)的連續(xù)時間,我們想要的結(jié)果為:

POLICYNO	STATE	START_DATE	END_DATEsm1		1	20210201	20210202sm1		2	20210203	20210203sm1		3	20210204	20210204sm1		1	20210205	20210209sm1     1      20210216       20210219.........................

我這里提供5種寫法,可以歸結(jié)為兩大類:

一類:通過使用分析函數(shù)或自關(guān)聯(lián)獲取數(shù)據(jù)連續(xù)性,構(gòu)造一個分組字段進(jìn)行分組求最大最小值。

二類:通過樹形層次查詢獲取連續(xù)性,獲取起止時間。

一、通過使用lag分析函數(shù)獲取前后時間,根據(jù)當(dāng)前時間與前后時間的差值進(jìn)行判斷獲取時間連續(xù)性標(biāo)志,然后使用sum()over()對連續(xù)性標(biāo)志進(jìn)行累加,從而生成一個新的臨時分組字段,最終根據(jù)policyno,state,臨時分組字段進(jìn)行分組取最大最小值

這里為了好理解,每一個處理步驟都單獨寫出來了,實際使用中可以簡寫一下:

with t as--求出來每條數(shù)據(jù)當(dāng)天的前一天鏡像時間 (select a.policyno, a.state, a.snapdate, lag(a.snapdate) over(partition by a.policyno, a.state order by a.snapdate) as lag_tim    from zyd.temp_0430 a   order by a.policyno, a.snapdate),t1 as--判斷當(dāng)天鏡像時間和前一天的鏡像時間+1是否相等,如果相等就置為0否則置為1,新增臨時字段lxzt意為:連續(xù)狀態(tài)標(biāo)志 (select t.*, case   when t.snapdate = t.lag_tim + 1 then    0   else    1 end as lxzt    from t   order by policyno, snapdate),t2 as--根據(jù)lxzt字段進(jìn)行sum()over()求和,求出來一個新的用來做分組依據(jù)的字段,簡稱fzyj (select t1.*, sum(lxzt) over(order by policyno, snapdate) as fzyj from t1)select policyno,--最后根據(jù)policyno,state,fzyj進(jìn)行分組求最大最小值即為狀態(tài)連續(xù)的開始結(jié)束時間       state,       -- fzyj,       min(snapdate) as start_snap,       max(snapdate) as end_snap  from t2 group by policyno, state, fzyj order by fzyj;

二、不使用lag分析函數(shù),通過自關(guān)聯(lián)也能判斷出來哪些天連續(xù),然后后面操作步驟同上,這個寫法算是對lag()over()函數(shù)的一個回寫,擺脫對分析函數(shù)的依賴

下面這種寫法,需要讀兩次表,上面lag的方式是對這個寫法的一種優(yōu)化:

with t as (select a.policyno, a.state, a.snapdate, b.snapdate as snap2    from zyd.temp_0430 a, zyd.temp_0430 b   where a.policyno = b.policyno(+)     and a.state = b.state(+)     and a.snapdate - 1 = b.snapdate(+)   order by policyno, snapdate),t1 as (select t.*, case   when snap2 is null then    1   else    0 end as lxzt    from t   order by policyno, snapdate),t2 as (select t1.*, sum(lxzt) over(order by policyno, snapdate) as fzyj    from t1   order by policyno, snapdate)select policyno,       state,       fzyj,       min(snapdate) as start_snap,       max(snapdate) as end_snap  from t2 group by policyno, state, fzyj order by fzyj;

三、通過構(gòu)造樹形結(jié)構(gòu),確定根節(jié)點和葉子節(jié)點來獲取狀態(tài)連續(xù)的開始和結(jié)束時間

先按照數(shù)據(jù)的連續(xù)性構(gòu)造顯示每層關(guān)系的樹狀結(jié)構(gòu):

with t as (select a.policyno, a.state, a.snapdate, lag(a.snapdate) over(partition by a.policyno, a.state order by a.snapdate) as lag_tim    from zyd.temp_0430 a --where policyno="sm1"   order by a.policyno, a.snapdate),t1 as (select t.*, case   when t.snapdate = t.lag_tim + 1 then    0   else    1 end as lxzt    from t   order by policyno, snapdate),t2 as (select t1.*, lpad("->", (level - 1) * 2, "->") || snapdate as 樹狀結(jié)構(gòu), level as 樹中層次, decode(level, 1, 1) 是否根節(jié)點, decode(connect_by_isleaf, 1, 1) 是否葉子節(jié)點, case   when (connect_by_isleaf = 0 and level > 1) then    1 end  是否樹杈, (prior snapdate) as 根值, connect_by_root snapdate 主根值    from t1   start with (lxzt = 1)  connect by (prior snapdate = snapdate - 1   and prior state = state and      prior policyno = policyno)   order by policyno, snapdate)select * from t2;

從上面能清晰的看出來,每一次連續(xù)狀態(tài)的開始日期作為每個樹的根,分支節(jié)點即樹杈和葉子節(jié)點的關(guān)系一步步拓展開來,分析上面數(shù)據(jù)我們能夠知道,如果我們想要獲取每個保單狀態(tài)連續(xù)時間范圍,以上面的數(shù)據(jù)現(xiàn)有分布方式,現(xiàn)在就可以:通過policyno,state,主根值進(jìn)行g(shù)roup by 取snapdate的最大最小值,類似前面兩個寫法的最終步驟;

接下來,我們這個第三種寫法就是按照這個方式寫:

with t as (select a.policyno, a.state, a.snapdate, lag(a.snapdate) over(partition by a.policyno, a.state order by a.snapdate) as lag_tim    from zyd.temp_0430 a --where policyno="sm1"   order by a.policyno, a.snapdate),t1 as (select t.*, case   when t.snapdate = t.lag_tim + 1 then    0   else    1 end as lxzt    from t   order by policyno, snapdate),t2 as (select t1.*, lpad("->", (level - 1) * 2, "->") || snapdate as 樹狀結(jié)構(gòu), level as 樹中層次, decode(level, 1, 1) 是否根節(jié)點, decode(connect_by_isleaf, 1, 1) 是否葉子節(jié)點, case   when (connect_by_isleaf = 0 and level > 1) then    1 end  是否樹杈, (prior snapdate) as 根值, connect_by_root snapdate 主根值    from t1   start with (lxzt = 1)  connect by (prior snapdate = snapdate - 1   and prior state = state and      prior policyno = policyno)   order by policyno, snapdate)select policyno,       state,       min(snapdate) as start_date,       max(snapdate) as end_date  from t2 group by policyno, state, 主根值 order by policyno, state;

四、參照過程三,既然已經(jīng)獲取了每條數(shù)據(jù)的主根值和葉子節(jié)點的值,這就代表了我們知道了每個保單狀態(tài)的連續(xù)開始和結(jié)束時間,那直接取出來葉子節(jié)點數(shù)據(jù),葉子節(jié)點主根值就是開始日期,葉子節(jié)點的值就是結(jié)束日期,這樣我們就不需再group by了

with t as (select a.policyno, a.state, a.snapdate, lag(a.snapdate) over(partition by a.policyno, a.state order by a.snapdate) as lag_tim    from zyd.temp_0430 a --where policyno="sm1"   order by a.policyno, a.snapdate),t1 as (select t.*, case   when t.snapdate = t.lag_tim + 1 then    0   else    1 end as lxzt    from t   order by policyno, snapdate),t2 as (select t1.*, lpad("->", (level - 1) * 2, "->") || snapdate as 樹狀結(jié)構(gòu), level as 樹中層次, decode(level, 1, 1) 是否根節(jié)點, decode(connect_by_isleaf, 1, 1) 是否葉子節(jié)點, case   when (connect_by_isleaf = 0 and level > 1) then    1 end 是否樹杈, (prior snapdate) as 根值, connect_by_root snapdate 主根值    from t1   start with (lxzt = 1)  connect by (prior snapdate = snapdate - 1 and prior state = state and     prior policyno = policyno)   order by policyno, snapdate)select policyno, state, 主根值 as start_date, snapdate as end_date  from t2 where 是否葉子節(jié)點 = 1 order by policyno, snapdate

五、在Oracle10g之前,上面樹狀查詢的關(guān)鍵函數(shù) connect_by_root還不支持,如果使用樹形結(jié)構(gòu),可以通過sys_connect_by_path來實現(xiàn)

with t as (select a.policyno, a.state, a.snapdate, lag(a.snapdate) over(partition by a.policyno, a.state order by a.snapdate) as lag_tim  --case when lag(a.snapdate) over(partition by a.policyno, a.state order by a.snapdate) is null then snapdate else lag(a.snapdate) over(partition by a.policyno, a.state order by a.snapdate) end as lag_tim    from zyd.temp_0430 a   order by a.policyno, a.snapdate),t1 as (select t.*, case   when t.snapdate = t.lag_tim + 1 then    0   else    1 end as lxzt    from t   order by policyno, snapdate),t2 as (select t1.*, sys_connect_by_path(snapdate, ",") as pt, level, connect_by_isleaf as cb    from t1   start with (lxzt = 1)  connect by (prior snapdate = snapdate - 1 and prior state = state and     prior policyno = policyno))select t2.*,       regexp_substr(pt, "[^,]+", 1, 1) as start_date,       regexp_substr(pt, "[^,]+", 1, regexp_count(pt, ",")) as end_date  from t2 where cb = 1 order by policyno, state;

還有好多其他寫法,這里不再一一列舉!

總結(jié)

到此這篇關(guān)于Oracle數(shù)倉中判斷時間連續(xù)性的幾種SQL寫法的文章就介紹到這了,更多相關(guān)Oracle數(shù)倉判斷時間連續(xù)性內(nèi)容請搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

標(biāo)簽: Oracle
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
你懂的国产精品永久在线| 一区二区精品伦理...| 久久久久蜜桃| 日本免费久久| 成人av动漫在线观看| 免费视频亚洲| 美女精品一区| 日本久久一区| 免费看久久久| 日韩av免费| 老鸭窝毛片一区二区三区| 热久久久久久久| 国产色99精品9i| 麻豆精品新av中文字幕| 日韩成人精品一区| 激情自拍一区| 亚洲视频二区| 精品在线网站观看| 1024精品一区二区三区| 最近国产精品视频| 精品精品国产三级a∨在线| 在线精品国产亚洲| 狠狠久久伊人中文字幕| 亚洲免费一区二区| 国产精品一级| 欧美日韩高清| 国产激情久久| 影音先锋国产精品| 国产情侣一区| 99热精品久久| 日韩精品久久久久久| 麻豆理论在线观看| 男女男精品视频网| 久久久久久婷| 一区二区高清| 欧美天堂视频| 日韩精品一页| 色综合www| 日韩精品免费视频人成| 欧美日韩中文一区二区| 国产乱码精品| 亚洲精品a级片| 久久中文字幕一区二区三区| 亚洲国产影院| 久久av免费看| 亚洲精品亚洲人成在线观看| 日韩精品首页| 久久天堂影院| 日韩有码av| 欧美在线影院| 国产粉嫩在线观看| 日本麻豆一区二区三区视频| 亚洲91视频| 国产精品久久久久av蜜臀| 亚洲免费中文| a日韩av网址| 国产精品一页| 一区二区精品| 一本色道精品久久一区二区三区| 国产高清精品二区| 亚洲日本国产| 1024精品久久久久久久久| 高清一区二区| 国产精品三级| 日韩国产91| 亚洲午夜久久| 一区福利视频| 99精品美女| 色综合五月天| 国产精品地址| 久久国产视频网| 日韩欧美在线精品| 免费人成黄页网站在线一区二区| 亚洲午夜黄色| 精品国产免费人成网站| 国产一区二区三区成人欧美日韩在线观看 | 91精品国产自产精品男人的天堂| 亚洲经典在线| 亚洲一级二级| 在线日韩中文| 日韩精品一区二区三区免费观影| 国产一区二区亚洲| 国产精品三p一区二区| 国产日本亚洲| 国产精品一区免费在线| 国产乱人伦丫前精品视频| 日本午夜精品久久久久| 久久亚洲二区| 视频一区二区不卡| 日韩一区二区三区四区五区| 蜜桃视频一区二区三区在线观看| 免播放器亚洲| 亚州精品视频| 欧美一级网站| 国产精品一区免费在线| 国产精品hd| 精品三级在线| 成人在线免费观看网站| 成人av三级| 136国产福利精品导航网址| 婷婷激情图片久久| 三级一区在线视频先锋| 日本欧洲一区二区| 日韩黄色av| 国产伦精品一区二区三区在线播放| 国产精品一线| 欧美日韩在线观看首页| 日韩精品第一区| 亚洲天堂久久| 9久re热视频在线精品| 亚洲伊人影院| 欧美专区一区| 老司机精品视频在线播放| 国产一区二区三区四区五区 | 亚洲精品大片| 国产九一精品| 久久久精品网| 综合欧美亚洲| 老司机免费视频一区二区| 日韩欧美三级| 久久国产66| 欧美激情福利| 亚洲成人精品| 亚洲在线久久| 国产精品网站在线看| 日韩大片免费观看| 狠狠干成人综合网| 一区二区三区网站| 精品久久福利| 99久久夜色精品国产亚洲1000部| 丝瓜av网站精品一区二区| 18国产精品| 黄色aa久久| 亚洲三级观看| 精品亚洲a∨一区二区三区18| 欧美 日韩 国产精品免费观看| 日韩一区精品视频| 麻豆视频一区二区| 中文在线一区| 精品欧美视频| 国产偷自视频区视频一区二区| 欧美视频二区| 国产精品亲子伦av一区二区三区| 91精品推荐| 日本在线不卡视频| 在线天堂中文资源最新版| 免费在线欧美视频| 国产成人免费| 亚洲精品综合| 欧美成人a交片免费看| 亚洲欧美专区| 亚洲一级少妇| 国产乱人伦精品一区| 婷婷中文字幕一区| 加勒比视频一区| 亚洲精品成人一区| 成人看片网站| 欧美欧美黄在线二区| 久久亚洲国产| 国产精品最新| 蜜臀91精品一区二区三区| 日韩在线视频精品| 国产探花一区在线观看| 日韩一区二区免费看| 粉嫩av一区二区三区四区五区 | 亚洲经典在线| 色网在线免费观看| 国产欧美二区| 亚洲精品一级二级三级| 亲子伦视频一区二区三区| 国产精品久久久久久久久久齐齐 | 亚洲a一区二区三区| 中文字幕一区二区三区日韩精品| 激情亚洲影院在线观看| 欧美一区二区三区久久精品| 亚洲精品123区| 精品中文在线| 日韩精品第二页| 日韩视频二区| 国产91一区| 日韩免费福利视频| 国产一区二区三区不卡视频网站 | 午夜电影一区| 亚洲一区有码| 亚洲一区二区三区高清| 99久久精品网| 日韩中文影院| 91一区二区| 里番精品3d一二三区| 欧美日韩一区二区三区四区在线观看| 美女黄网久久| 99国产一区| 9色国产精品| 一区在线免费| 最新国产拍偷乱拍精品| 精品成人免费一区二区在线播放| 国产一区二区三区四区五区 | 97精品在线| 美腿丝袜亚洲一区| 国产亚洲精aa在线看|