当前位置: 首页 > news >正文

Oracle - 多区间按权重取值逻辑

啰嗦: 其实很早就遇到过类似问题,也设想过,不过一致没实际业务需求,也就耽搁了;最近有业务提到了,和同事讨论,各有想法,所以先把逻辑整理出来,希望有更好更优的解决方案;

背景:

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

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

分析: 如果是单天计算, 那很简单,可以直接按天匹配,然后取 方案1> 方案2> 方案3;

现在要展示,讨论有2种方案,1.区间完全切割开,形成最小时间区间,进行取值;2.放临时表,从低优先级开始,进行不断迭代覆盖;

这里主要展示方案1, 主要感觉方案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 1 AS LEVE, '20230601' AS BEGINDATE, '20231031' AS ENDDATEFROM DUAL),
B AS  --开始日期和截止日期合并一列(SELECT BEGINDATE AS DAY FROM A UNION SELECT ENDDATE FROM A ORDER BY DAY),
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 B),
D AS  --生成最小的时间区间,并关联各个时间边界当天(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)
--最后进行查询匹配, 权重取最小 
SELECT D.*, MIN(A.LEVE) AS LEVEFROM DLEFT JOIN AON D.BEGINDATE >= A. BEGINDATEAND D.ENDDATE <= A.ENDDATEGROUP BY D.BEGINDATE, D.ENDDATEORDER BY D.BEGINDATE, D.ENDDATE

执行结果 :

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

方便的话,告知下合并的方式,再此特别感谢。

http://www.lryc.cn/news/179184.html

相关文章:

  • 本次CTF·泰山杯网络安全的基础知识部分(二)
  • MyBatis 映射文件(Mapper XML):配置与使用
  • 基于 SpringBoot 的大学生租房网站
  • BL808学习日志-0-概念理解
  • CISSP学习笔记:业务连续性计划
  • .NET Nuget包推荐安装
  • 【文献阅读】Pocket2Mol : 基于3D蛋白质口袋的高效分子采样 + CrossDocked数据集说明
  • TrustRadius 评论:为什么 Splashtop 优于 LogMeIn
  • 【动态规划】动态规划经典例题 力扣牛客
  • 统计模型----决策树
  • C# List 复制之深浅拷贝
  • 论<script> 标签可以直接写在 HTML 文件中的哪些位置?(可以将 <script> 标签直接插入到 HTML 文件的任何位置)
  • 【MySQL进阶】--- 存储引擎的介绍
  • self-XSS漏洞SRC挖掘
  • 1859. 将句子排序
  • 普通学校,普通背景,普通公司,不普通总结。
  • Flink之Watermark生成策略
  • 提升API文档编写效率,Dash for Mac是你的不二之选
  • 无人注意,新安装的 Ubuntu 23.04 不支持安装 32 位应用
  • 全面横扫:dlib Python API在Linux和Windows的配置方案
  • 30种编程语言写国庆节快乐,收藏后改改留着拜年用
  • SpringBoot2.7.9 配置文件加载方式
  • 详解C语言—文件操作
  • IntelliJ IDEA 常用快捷键一览表
  • cola 架构简单记录
  • FFmpeg常用结构体分析
  • ChatGPT 学习笔记 | 什么是 Prompt-tuning?
  • [红明谷CTF 2021]write_shell %09绕过过滤空格 ``执行
  • JVM学习笔记
  • 使用 gst-element-maker 创建一个完全透传的 videofilter 插件