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


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

    背景:

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

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

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

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

    这里主要展示方案1, 主要感觉方案1可以直接查询出来,应该是比较简单的;

     直接贴代码

    1. WITH A AS --基础数据
    2. (SELECT 3 AS LEVE, '20230101' AS BEGINDATE, '20231231' AS ENDDATE
    3. FROM DUAL
    4. UNION ALL
    5. SELECT 2 AS LEVE, '20230301' AS BEGINDATE, '20230731' AS ENDDATE
    6. FROM DUAL
    7. UNION ALL
    8. SELECT 1 AS LEVE, '20230601' AS BEGINDATE, '20231031' AS ENDDATE
    9. FROM DUAL),
    10. B AS --开始日期和截止日期合并一列
    11. (SELECT BEGINDATE AS DAY FROM A UNION SELECT ENDDATE FROM A ORDER BY DAY),
    12. C AS --生产日期节点前后一天,将时间边界当天天单独作为一条记录
    13. (SELECT DAY,
    14. TO_CHAR(TO_DATE(DAY, 'yyyyMMdd') - 1, 'yyyyMMdd') AS DAY_LAST,
    15. TO_CHAR(TO_DATE(DAY, 'yyyyMMdd') + 1, 'yyyyMMdd') AS DAY_NEXT,
    16. ROWNUM N
    17. FROM B),
    18. D AS --生成最小的时间区间,并关联各个时间边界当天
    19. (SELECT C1.DAY_NEXT AS BEGINDATE, C2.DAY_LAST AS ENDDATE
    20. FROM C C1, C C2
    21. WHERE C1.N + 1 = C2.N
    22. UNION
    23. SELECT DAY AS BEGINDATE, DAY AS ENDDATE
    24. FROM C
    25. ORDER BY BEGINDATE)
    26. --最后进行查询匹配, 权重取最小
    27. SELECT D.*, MIN(A.LEVE) AS LEVE
    28. FROM D
    29. LEFT JOIN A
    30. ON D.BEGINDATE >= A. BEGINDATE
    31. AND D.ENDDATE <= A.ENDDATE
    32. GROUP BY D.BEGINDATE, D.ENDDATE
    33. ORDER BY D.BEGINDATE, D.ENDDATE

    执行结果 :

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

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

  • 相关阅读:
    虚拟摄像头之四: 谁在调用 v4l2_camera_HAL 摄像头驱动
    自己搭建的大疆无人机RTMP流媒体服务延迟太大
    “入门C++编程需要多长时间?如何高效学习?“
    busybox的实现原理分析(C语言实现简易版的busybox)
    Android中将Bitmap转换成byte[]数组及ParcelFileDescriptor
    NeRF数据集介绍
    compile Python missing or unusable error while cross compiling GDB
    设计原则——合成复用原则
    codeforces每日5题(均1600)-第三十二天
    【FPGA】基于状态机实现自动售货机模拟
  • 原文地址:https://blog.csdn.net/shijianduan1/article/details/133386281