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

您的位置:首頁技術文章
文章詳情頁

Oracle數倉中判斷時間連續性的幾種SQL寫法示例

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

零、需求介紹

現有一張表數據如下:

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

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

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

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

一類:通過使用分析函數或自關聯獲取數據連續性,構造一個分組字段進行分組求最大最小值。

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

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

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

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   order by a.policyno, a.snapdate),t1 as--判斷當天鏡像時間和前一天的鏡像時間+1是否相等,如果相等就置為0否則置為1,新增臨時字段lxzt意為:連續狀態標志 (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--根據lxzt字段進行sum()over()求和,求出來一個新的用來做分組依據的字段,簡稱fzyj (select t1.*, sum(lxzt) over(order by policyno, snapdate) as fzyj from t1)select policyno,--最后根據policyno,state,fzyj進行分組求最大最小值即為狀態連續的開始結束時間       state,       -- fzyj,       min(snapdate) as start_snap,       max(snapdate) as end_snap  from t2 group by policyno, state, fzyj order by fzyj;

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

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

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;

三、通過構造樹形結構,確定根節點和葉子節點來獲取狀態連續的開始和結束時間

先按照數據的連續性構造顯示每層關系的樹狀結構:

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 樹狀結構, level as 樹中層次, decode(level, 1, 1) 是否根節點, decode(connect_by_isleaf, 1, 1) 是否葉子節點, 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;

從上面能清晰的看出來,每一次連續狀態的開始日期作為每個樹的根,分支節點即樹杈和葉子節點的關系一步步拓展開來,分析上面數據我們能夠知道,如果我們想要獲取每個保單狀態連續時間范圍,以上面的數據現有分布方式,現在就可以:通過policyno,state,主根值進行group 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 樹狀結構, level as 樹中層次, decode(level, 1, 1) 是否根節點, decode(connect_by_isleaf, 1, 1) 是否葉子節點, 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;

四、參照過程三,既然已經獲取了每條數據的主根值和葉子節點的值,這就代表了我們知道了每個保單狀態的連續開始和結束時間,那直接取出來葉子節點數據,葉子節點主根值就是開始日期,葉子節點的值就是結束日期,這樣我們就不需再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 樹狀結構, level as 樹中層次, decode(level, 1, 1) 是否根節點, decode(connect_by_isleaf, 1, 1) 是否葉子節點, 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 是否葉子節點 = 1 order by policyno, snapdate

五、在Oracle10g之前,上面樹狀查詢的關鍵函數 connect_by_root還不支持,如果使用樹形結構,可以通過sys_connect_by_path來實現

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;

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

總結

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

標簽: Oracle
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产视频网站一区二区三区| 国产视频一区在线观看一区免费| 麻豆成人在线| 一区二区亚洲精品| 日韩成人高清| 五月激情久久| 久久香蕉国产| 99re国产精品| 免费精品视频最新在线| 免播放器亚洲一区| 亚洲aⅴ网站| 国产欧美午夜| 国产一区二区三区四区五区| 欧美精品日日操| 欧美日韩激情| 视频在线在亚洲| 亚洲另类黄色| 国产精品二区影院| 中文av在线全新| 亚洲国内精品| 亚洲精选久久| 国产精品第一| 日本精品在线中文字幕| 久久电影一区| 国产精品网址| 欧美激情另类| 国产精品普通话对白| 日本中文字幕一区二区视频| 国产精品欧美三级在线观看| 精品久久久网| 性欧美69xoxoxoxo| 日韩久久一区| 中文字幕在线高清| 视频一区二区中文字幕| 蜜臀久久99精品久久久久宅男 | 国产免费av一区二区三区| 国产精品宾馆| 亚洲四虎影院| 亚洲精品精选| 精品国产一区二区三区av片| 九一精品国产| 人人爱人人干婷婷丁香亚洲| 福利视频一区| 亚洲欧美日本国产专区一区| 国产乱码精品一区二区三区亚洲人| 国内精品麻豆美女在线播放视频| 日韩精品久久久久久久电影99爱 | 久久不卡日韩美女| 久久精品动漫| 婷婷综合国产| 97精品中文字幕| 性一交一乱一区二区洋洋av| 国产精品啊v在线| 欧美特黄一区| 老鸭窝一区二区久久精品| 午夜欧美精品久久久久久久| 国产日韩欧美一区在线| 91精品一区二区三区综合在线爱| 亚洲视频电影在线| 久久电影tv| 婷婷亚洲成人| 欧美肉体xxxx裸体137大胆| 欧美在线看片| 在线视频日韩| 精品精品99| 免费一级片91| 日韩免费av| 欧美日韩一区二区三区四区在线观看 | 亚洲福利专区| 欧美日韩精品一区二区三区视频 | 亚洲成人不卡| 国产情侣久久| 六月天综合网| 色偷偷色偷偷色偷偷在线视频| 日韩中文字幕在线一区| 岛国av在线网站| 日本va欧美va瓶| 国产一在线精品一区在线观看| 欧美另类中文字幕 | 国产成人免费精品| 日韩欧美三区| 99香蕉国产精品偷在线观看 | 精品一区二区三区免费看| 丝袜国产日韩另类美女| 精品国产乱码| 青草国产精品久久久久久| 精品在线99| av高清不卡| 久久99蜜桃| 日本午夜免费一区二区| 在线精品一区二区| 国产精品美女久久久| 在线日韩视频| 天堂中文在线播放| 另类欧美日韩国产在线| 日韩av中文字幕一区| japanese国产精品| а√天堂8资源中文在线| 国产精品s色| 日韩黄色av| 在线精品一区| 亚洲精品1区| 91精品精品| 一区二区三区四区日本视频| 九九久久国产| 国产精品中文字幕制服诱惑| 色综合视频一区二区三区日韩| 9久re热视频在线精品| 欧美亚洲激情| 久久婷婷av| 日韩中文在线电影| 麻豆国产精品一区二区三区| 日韩中文一区二区| av成人国产| 欧美日韩国产欧| 99精品综合| 欧美日韩精品免费观看视完整| 粉嫩av一区二区三区四区五区| 国产精品亚洲欧美一级在线| 青草国产精品| 国产日韩亚洲欧美精品| 69堂免费精品视频在线播放| 日韩欧美2区| 日韩1区2区日韩1区2区| 亚洲精品无播放器在线播放| 亚洲尤物在线| 女人天堂亚洲aⅴ在线观看| 欧美va天堂在线| 成人羞羞视频在线看网址| 亚洲深夜视频| 久久久久99| 亚洲第一区色| 亚洲欧美日韩国产一区二区| 日韩在线观看一区二区| 日韩在线观看一区二区| 亚洲三级国产| 欧美日韩一区自拍| 久久尤物视频| 国产成人黄色| 欧美sm一区| 九九综合九九| 99亚洲精品| 中文字幕日韩高清在线| 日韩欧美中文字幕在线视频| 亚洲精品福利| 国产探花在线精品一区二区| 国产精品日韩精品在线播放| 精品中文字幕一区二区三区| 免费一二一二在线视频| 欧美精选一区二区三区| 亚洲一区二区日韩| 国产精品巨作av| 成人精品视频| 国产一区日韩一区| 亚洲三级国产| 国产精品嫩草影院在线看| 欧美日韩一区自拍| 国产精品.xx视频.xxtv| 国产精品亚洲一区二区三区在线观看| 免费毛片在线不卡| 在线免费观看亚洲| 欧美黄页在线免费观看| 日韩精品免费一区二区三区| 亚洲在线一区| 国产精品中文字幕制服诱惑| 都市激情国产精品| 亚洲电影在线一区二区三区| 日韩精品视频一区二区三区| 国产一区二区三区四区五区传媒 | 在线精品亚洲欧美日韩国产| 久久精品官网| 亚洲三级观看| 成人在线视频区| 国产精品日韩| 久久精品国产99| 亚洲国产成人精品女人| 日韩国产一区二| 日韩在线高清| 日韩亚洲精品在线观看| 国产精品成人一区二区不卡| 尤物精品在线| 鲁大师精品99久久久| 欧美成人亚洲| 国产欧美日韩亚洲一区二区三区| 91精品国产调教在线观看| 免费成人在线观看| 超碰在线99| 日本成人在线视频网站| 婷婷国产精品| 国产精品tv| 人人精品人人爱| 日本欧美不卡| 国产日产精品_国产精品毛片 | 日韩美女精品| 亚洲成人国产| 国产精品久久久久久久免费软件| 精品一区在线| 精品资源在线| 日韩精品一区二区三区中文字幕| 久久蜜桃精品|