Oracle - 多区间按权重取值逻辑 ,分时区-多层级-取配置方案(三)

embedded/2024/11/24 1:01:30/

本篇紧跟第一篇, 和 第二篇无关

 Oracle - 多区间按权重取值逻辑 ,分时区-多层级-取配置方案

Oracle - 多区间按权重取值逻辑 ,分时区-多层级-取配置方案(二)

先说需求:

某业务配置表,按配置的时间区间及组织层级取方案,形成报表展示出所有部门方案的取值;

例如,总公司配置20230101-20231231为方案3, 分公司配置 20230301-20230731  为方案2,部门配置20230601-20231031 为方案1,配置优先级为 部门> 分公司>总公司 ,即啥都没配则使用总公司默认值;

第一篇说到,拆分出了很多日期边界,由于时间区间边界当天,不好判断,只能单独拉出来作为一条记录, 虽然保证了边界数据的准确性,但拆分太散后 无法合并到一起。

最近一直在琢磨,琢磨不同方案 ,各种方法,在刚刚发完第二篇的适合,灵光一现,一下解决了。

还是得说明下, 这里是默认 数据源是正确,同一优先级的时间区间不重复的(相连的倒是没关系)

数据源:

最后输出结果:

按优先级拆分时间区间。

前前后后零零散散的时间处理的,就加了很多中间表, 不过目前效果已经达到了,
后面就进行相关代码优化就好了。

代码:

WITH A AS --基础数据(SELECT 3 AS LEVE, '20230101' AS BEGINDATE, '20231231' AS ENDDATEFROM DUALUNION ALLSELECT 2 AS LEVE, '20230301' AS BEGINDATE, '20230731' AS ENDDATEFROM DUALUNION ALLSELECT 2 AS LEVE, '20231001' AS BEGINDATE, '20231130' AS ENDDATEFROM DUALUNION ALLSELECT 1 AS LEVE, '20230201' AS BEGINDATE, '20230831' AS ENDDATEFROM DUAL)
--SELECT *  FROM A ORDER BY A.BEGINDATE
, C AS --生产日期节点前后一天,将时间边界当天天单独作为一条记录(SELECT DAY,TO_CHAR(TO_DATE(DAY, 'yyyyMMdd') - 1, 'yyyyMMdd') AS DAY_LAST,TO_CHAR(TO_DATE(DAY, 'yyyyMMdd') + 1, 'yyyyMMdd') AS DAY_NEXT,ROWNUM NFROM (SELECT BEGINDATE AS DAY FROM A UNION SELECT ENDDATE FROM A ORDER BY DAY)),
--最后进行查询匹配, 权重取最小
E AS(SELECT D.*, MIN(A.LEVE) AS LEVEFROM (SELECT C1.DAY_NEXT AS BEGINDATE, C2.DAY_LAST AS ENDDATEFROM C C1, C C2WHERE C1.N + 1 = C2.NUNIONSELECT DAY AS BEGINDATE, DAY AS ENDDATEFROM CORDER BY BEGINDATE) D --生成最小的时间区间,并关联各个时间边界当天LEFT JOIN AON D.BEGINDATE >= A. BEGINDATEAND D.ENDDATE <= A.ENDDATEGROUP BY D.BEGINDATE, D.ENDDATEORDER BY D.BEGINDATE, D.ENDDATE)
--分段进行汇总
,
F AS(SELECT NVL(C.DAY, E.BEGINDATE) AS BEGINDATE, NVL(C2.DAY, E.ENDDATE) AS ENDDATE, E.LEVEFROM ELEFT JOIN CON E.BEGINDATE <> E.ENDDATEAND E.BEGINDATE = C.DAY_NEXTAND EXISTS (SELECT 1FROM E E2WHERE E2.BEGINDATE = E2.ENDDATEAND E2.BEGINDATE = C.DAYAND E.LEVE = E2.LEVE)LEFT JOIN C C2ON E.BEGINDATE <> E.ENDDATEAND E.ENDDATE = C2.DAY_LASTAND EXISTS (SELECT 1FROM E E2WHERE E2.BEGINDATE = E2.ENDDATEAND E2.ENDDATE = C2.DAYAND E.LEVE = E2.LEVE)ORDER BY E.LEVE, E.BEGINDATE)
--去掉边界日期
,
G AS(SELECT F.*, ROWNUM NFROM FWHERE F.BEGINDATE <> F.ENDDATEOR NOT EXISTS(SELECT 1FROM F F2WHERE F2.BEGINDATE = F2.ENDDATEAND F2.LEVE = F.LEVEAND (F2.BEGINDATE = F. BEGINDATE OR F2.BEGINDATE = F. ENDDATE))ORDER BY BEGINDATE),
H(B1,
E1,
L1) AS(SELECT BEGINDATE, ENDDATE, LEVEFROM GWHERE G.BEGINDATE NOT IN (SELECT ENDDATE FROM G)UNION ALLSELECT H.B1, H2.ENDDATE AS E1, H.L1FROM HJOIN G H2ON H.E1 = H2.BEGINDATEAND H.L1 = H2.LEVE)
SELECT B1, MAX(E1), L1 FROM H GROUP BY B1, L1;


http://www.ppmy.cn/embedded/139989.html

相关文章

Ubuntu上安装MySQL并且实现远程登录

目录 下载网络工具 查看网络连接 更新系统软件包&#xff1b; 安装mysql数据库 查看mysql数据库状态 以数字ip形式显示mysql的监听状态。&#xff08;默认监听端口是3306&#xff09; 查看安装mysql数据库时系统创建的目录信息。 根据查询到的系统用户名以及随机密码&a…

超高流量多级缓存架构设计!

文章内容已经收录在《面试进阶之路》&#xff0c;从原理出发&#xff0c;直击面试难点&#xff0c;实现更高维度的降维打击&#xff01; 文章目录 电商-多级缓存架构设计多级缓存架构介绍多级缓存请求流程负载均衡算法的选择轮询负载均衡一致性哈希负载均衡算法选择 应用层 Ngi…

Perfetto学习大全

Perfetto 是一个功能强大的性能分析和追踪工具&#xff0c;主要用于捕获和分析复杂系统中的事件和性能数据&#xff0c;特别是在 Android 和 Linux 环境下。它的核心目标是帮助开发者深入了解系统和应用程序的运行状态&#xff0c;以便优化性能和诊断问题。 Perfetto的主要作用…

【蓝桥杯备赛】深秋的苹果

# 4.1.1. 题目解析 要求某个区间内的数字两两相乘的总和想到前缀和&#xff0c;但是这题重点在于两两相乘先硬算&#xff0c;找找规律&#xff1a; 比如要算这串数字的两两相乘的积之和&#xff1a; 1, 2, 3 1*2 1*3 2*3 1*(23) 2*3 前缀和数组&#xff1a; 1 3 6 发现…

小说推文封面怎么用AI快速制作?

引言 在数字出版和社交媒体时代&#xff0c;一个吸引人的小说推文封面对于吸引读者至关重要。本文将详细介绍如何使用StartAI的文生图工具来制作小说推文封面&#xff0c;包括选择模型、lora和控制参数的步骤。 制作小说推文封面的步骤 1. 确定封面主题和风格 首先&#xf…

Unity 使用 Excel 进行配置管理(读Excel配置表、Excel转保存Txt 文本、读取保存的 Txt 文本配置内容)

Unity 使用 Excel 进行配置管理(读Excel配置表、Excel转保存Txt 文本、读取保存的 Txt 文本配置内容) 目录 Unity 使用 Excel 进行配置管理(读Excel配置表、Excel转保存Txt 文本、读取保存的 Txt 文本配置内容) 一、简单介绍 二、实现原理 三、注意事项 四、案例简单步…

k8s默认使用的后端网络模式

1. CNI简介 在 Kubernetes (K8s) 中,网络后端(CNI 插件)负责为集群中的容器提供网络连接。Kubernetes 默认并没有选择特定的 CNI 插件,而是允许用户根据需求选择使用不同的网络插件。 不过,Kubernetes 通过 kubeadm 或其他工具来初始化集群时,会使用某个默认的网络后端,…

5G轻量级核心网解决方案

随着5G技术的快速发展&#xff0c;各行业对网络能力的需求不断增加&#xff0c;传统的5G核心网&#xff08;5GC&#xff09;解决方案由于其高昂的部署和运营成本&#xff0c;常常成为企业面临的一个重大挑战。为了解决这一问题&#xff0c;5G轻量级核心网解决方案应运而生&…