电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:212日期: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
主站蜘蛛池模板: 胶辊硫化罐_胶鞋硫化罐_硫化罐厂家-山东鑫泰鑫智能装备有限公司 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 铣刨料沥青破碎机-沥青再生料设备-RAP热再生混合料破碎筛分设备 -江苏锡宝重工 | 硬质合金模具_硬质合金非标定制_硬面加工「生产厂家」-西迪技术股份有限公司 | 不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰]-不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰] | 不锈钢复合板|钛复合板|金属复合板|南钢集团安徽金元素复合材料有限公司-官网 | 软文发布平台 - 云软媒网络软文直编发布营销推广平台 | 大型工业风扇_工业大风扇_大吊扇_厂房车间降温-合昌大风扇 | 艾默生变频器,艾默生ct,变频器,ct驱动器,广州艾默生变频器,供水专用变频器,风机变频器,电梯变频器,艾默生变频器代理-广州市盟雄贸易有限公司官方网站-艾默生变频器应用解决方案服务商 | 爱佩恒温恒湿测试箱|高低温实验箱|高低温冲击试验箱|冷热冲击试验箱-您身边的模拟环境试验设备技术专家-合作热线:400-6727-800-广东爱佩试验设备有限公司 | PC构件-PC预制构件-构件设计-建筑预制构件-PC构件厂-锦萧新材料科技(浙江)股份有限公司 | 烟气在线监测系统_烟气在线监测仪_扬尘检测仪_空气质量监测站「山东风途物联网」 | 凝胶成像系统(wb成像系统)百科-上海嘉鹏| 净化车间_洁净厂房_净化公司_净化厂房_无尘室工程_洁净工程装修|改造|施工-深圳净化公司 | 路面机械厂家| 兰州牛肉面加盟,兰州牛肉拉面加盟-京穆兰牛肉面 | 头条搜索极速版下载安装免费新版,头条搜索极速版邀请码怎么填写? - 欧远全 | 深圳法律咨询【24小时在线】深圳律师咨询免费 | 天津中都白癜风医院_天津白癜风医院_天津治疗白癜风 | 长沙广告公司|长沙广告制作设计|长沙led灯箱招牌制作找望城湖南锦蓝广告装饰工程有限公司 | 快速门厂家批发_PVC快速卷帘门_高速门_高速卷帘门-广州万盛门业 快干水泥|桥梁伸缩缝止水胶|伸缩缝装置生产厂家-广东广航交通科技有限公司 | 烟雾净化器-滤筒除尘器-防爆除尘器-除尘器厂家-东莞执信环保科技有限公司 | 原色会计-合肥注册公司_合肥代理记账公司_营业执照代办 | 金属软管_不锈钢金属软管_巩义市润达管道设备制造有限公司 | 无刷电机_直流无刷电机_行星减速机-佛山市藤尺机电设备有限公司 无菌检查集菌仪,微生物限度仪器-苏州长留仪器百科 | 成都顶呱呱信息技术有限公司-贷款_个人贷款_银行贷款在线申请 - 成都贷款公司 | 快速卷帘门_硬质快速卷帘门-西朗门业 | pbootcms网站模板|织梦模板|网站源码|jquery建站特效-html5模板网 | 恒温恒湿箱(药品/保健品/食品/半导体/细菌)-兰贝石(北京)科技有限公司 | 高效复合碳源-多核碳源生产厂家-污水处理反硝化菌种一长隆科技库巴鲁 | 透平油真空滤油机-变压器油板框滤油机-滤油车-华之源过滤设备 | 车间除尘设备,VOCs废气处理,工业涂装流水线,伸缩式喷漆房,自动喷砂房,沸石转轮浓缩吸附,机器人喷粉线-山东创杰智慧 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 主题班会网 - 安全教育主题班会,各类主题班会PPT模板 | 山楂片_雪花_迷你山楂片_山楂条饼厂家-青州市丰源食品厂 | 南京交通事故律师-专打交通事故的南京律师 | 宁波普瑞思邻苯二甲酸盐检测仪,ROHS2.0检测设备,ROHS2.0测试仪厂家 | 便携式高压氧舱-微压氧舱-核生化洗消系统-公众洗消站-洗消帐篷-北京利盟救援 | 液氨泵,液化气泵-淄博「亚泰」燃气设备制造有限公司 | 3dmax渲染-效果图渲染-影视动画渲染-北京快渲科技有限公司 | 消电检公司,消电检价格,北京消电检报告-北京设施检测公司-亿杰(北京)消防工程有限公司 | 诚暄电子公司首页-线路板打样,pcb线路板打样加工制作厂家 |