GED3{VP1XH~%3$IRIE{8FSB.png
    4LRQBJ5CQSW(6WR{KF}FH5W.png


    排序法通用逻辑:利用需要排序的列与row_number之差进行分组

    1. select period_state, min(dt) start_date, max(dt) end_date from
    2. (
    3. select *, subdate(dt,rank() over(partition by period_state order by dt)) dif from
    4. (
    5. select 'failed' period_state, fail_date dt from Failed where year(fail_date) = 2019
    6. union
    7. select 'succeeded' period_state, success_date dt from Succeeded where year(success_date) = 2019
    8. ) temp
    9. ) temp1
    10. group by period_state,dif
    11. order by start_date

    官方题解,使用临时变量,思路与上面是一样的

    SELECT period_state, MIN(date) as start_date, MAX(date) as end_date
    FROM (
        SELECT
            success_date AS date,
            "succeeded" AS period_state,
            IF(DATEDIFF(@pre_date, @pre_date := success_date) = -1, @id, @id := @id+1) AS id 
        FROM Succeeded, (SELECT @id := 0, @pre_date := NULL) AS temp
        UNION
        SELECT
            fail_date AS date,
            "failed" AS period_state,
            IF(DATEDIFF(@pre_date, @pre_date := fail_date) = -1, @id, @id := @id+1) AS id 
        FROM Failed, (SELECT @id := 0, @pre_date := NULL) AS temp
    ) T  WHERE date BETWEEN "2019-01-01" AND "2019-12-31"
    GROUP BY T.id
    ORDER BY start_date ASC