• 1225. 报告系统状态的连续日期


    SQL架构

    Table: Failed

    +--------------+---------+
    | Column Name  | Type    |
    +--------------+---------+
    | fail_date    | date    |
    +--------------+---------+
    该表主键为 fail_date。
    该表包含失败任务的天数.
    

    Table: Succeeded

    +--------------+---------+
    | Column Name  | Type    |
    +--------------+---------+
    | success_date | date    |
    +--------------+---------+
    该表主键为 success_date。
    该表包含成功任务的天数.
    

    系统 每天 运行一个任务。每个任务都独立于先前的任务。任务的状态可以是失败或是成功。

    编写一个 SQL 查询 2019-01-01 到 2019-12-31 期间任务连续同状态 period_state 的起止日期(start_date 和 end_date)。即如果任务失败了,就是失败状态的起止日期,如果任务成功了,就是成功状态的起止日期。

    最后结果按照起始日期 start_date 排序

    查询结果样例如下所示:

    Failed table:
    +-------------------+
    | fail_date         |
    +-------------------+
    | 2018-12-28        |
    | 2018-12-29        |
    | 2019-01-04        |
    | 2019-01-05        |
    +-------------------+
    
    Succeeded table:
    +-------------------+
    | success_date      |
    +-------------------+
    | 2018-12-30        |
    | 2018-12-31        |
    | 2019-01-01        |
    | 2019-01-02        |
    | 2019-01-03        |
    | 2019-01-06        |
    +-------------------+
    
    
    Result table:
    +--------------+--------------+--------------+
    | period_state | start_date   | end_date     |
    +--------------+--------------+--------------+
    | succeeded    | 2019-01-01   | 2019-01-03   |
    | failed       | 2019-01-04   | 2019-01-05   |
    | succeeded    | 2019-01-06   | 2019-01-06   |
    +--------------+--------------+--------------+
    
    结果忽略了 2018 年的记录,因为我们只关心从 2019-01-01 到 2019-12-31 的记录
    从 2019-01-01 到 2019-01-03 所有任务成功,系统状态为 "succeeded"。
    从 2019-01-04 到 2019-01-05 所有任务失败,系统状态为 "failed"。
    从 2019-01-06 到 2019-01-06 所有任务成功,系统状态为 "succeeded"。
    1. (select
    2. 'failed' period_state,min(fail_date) start_date,max(fail_date) end_date
    3. from
    4. (
    5. select
    6. fail_date,date_sub(fail_date,interval row_number() over(order by fail_date) day) ds
    7. from
    8. Failed
    9. where
    10. fail_date >='2019-01-01' and fail_date <='2019-12-31'
    11. ) s1
    12. group by
    13. s1.ds
    14. union all
    15. select
    16. 'succeeded' period_state,min(success_date) start_date,max(success_date) end_date
    17. from
    18. (
    19. select
    20. success_date,date_sub(success_date,interval row_number() over(order by success_date) day) ds
    21. from
    22. Succeeded
    23. where
    24. success_date >='2019-01-01' and success_date <='2019-12-31'
    25. ) s1
    26. group by
    27. s1.ds
    28. )
    29. order by start_date

    笔记:

    order by 对 select 中的 内容 排序

    1. from (这里也包括from中的子语句)
    2. join
    3. on
    4. where
    5. group by(开始使用select中的别名,后面的语句中都可以使用;但是不能使用ROW_NUMBER()等窗口函数的别名)
    6. avg,sum.... 等聚合函数
    7. having
    8. select
    9. distinct
    10. order by
    11. limit


    if 嵌套 例如
    if(host_goals<guest_goals  ,0  , if(host_goals>guest_goals,3,1))

    标号 作差 值 一样 则为 连续

    union all 拼接完 上下 两个表 加括号以后 可以直接在最后 用 order by 进行排序

    date_sub(fail_date,***interval*** row_number() over(order by fail_date) ***day***)   注意 加重的地方 不要忘记写

  • 相关阅读:
    react中设置activeClassName的笔记
    前端全局工具函数utils.js/正则(持续更新)
    【机器学习】聚类【Ⅴ】密度聚类与层次聚类
    深入理解Java虚拟机(第3版)学习笔记——前端编译与优化(超详细)
    anaconda+tensorflow+sklearn,安装过程的一些问题
    抗菌药物丨Toronto Research Chemicals 天冬酰胺D
    软件测试的未来?为什么越来越多的公司选择模糊测试
    动态数据源自定义SqlSessionFactoryBean时mybatis plus配置失效
    C语言 | Leetcode C语言题解之第401题二进制手表
    linux centos Python + Selenium+Chrome自动化测试环境搭建?
  • 原文地址:https://blog.csdn.net/m0_69157845/article/details/125452249