1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

  2. Anuncie Aqui ! Entre em contato fdantas@4each.com.br

Predefined range of date to fill [duplicate]

Discussão em 'Outras Linguagens' iniciado por Stack, Maio 18, 2021.

  1. Stack

    Stack Membro Participativo

    I want to count the number of item by date, but sometimes the table doesn't contains rows with some dates, and I have a hole in the result, like :

    +------------+--------+
    | date | number |
    +------------+--------+
    | 2021-03-12 | 1 |
    | 2021-03-15 | 1 |
    | 2021-03-17 | 1 |
    | 2021-03-18 | 1 |
    +------------+--------+


    I would like this result:

    +------------+--------+
    | date | number |
    +------------+--------+
    | 2021-03-12 | 1 |
    | 2021-03-13 | 0 |
    | 2021-03-14 | 0 |
    | 2021-03-15 | 1 |
    | 2021-03-16 | 0 |
    | 2021-03-17 | 1 |
    | 2021-03-18 | 1 |
    +------------+--------+


    So, I created a temporary table with WITH, it works:

    WITH recursive Date_Ranges AS (
    select DATE(NOW() - INTERVAL 3 MONTH) AS Date
    union
    select Date + interval 1 day
    from Date_Ranges
    where Date < DATE(NOW())
    )
    SELECT *, 0 AS number FROM Date_Ranges


    Next, I want to retrieve the statistics, I tried with this query:

    WITH recursive Date_Ranges AS (
    select DATE(NOW()- INTERVAL 3 MONTH) AS Date
    union
    select Date + interval 1 day
    from Date_Ranges
    where Date < DATE(NOW())
    )
    select *, '0' AS value from Date_Ranges
    UNION DISTINCT
    SELECT DATE(time) AS date, count(*) AS number
    FROM my_table
    WHERE time >= NOW()- INTERVAL 3 MONTH
    AND time <= DATE(NOW())
    GROUP BY DATE(ca_time)



    But the UNION doesn't work because the value is different so mysql keep the 2 lines:

    example:
    +------------+--------+
    | date | number |
    +------------+--------+
    | 2021-03-12 | 0 |
    | 2021-03-13 | 0 |
    | 2021-03-14 | 0 |
    | 2021-03-15 | 0 |
    | 2021-03-16 | 0 |
    | 2021-03-17 | 0 |
    | 2021-03-18 | 0 |
    | 2021-03-12 | 2 |
    | 2021-03-13 | 6 |
    | 2021-03-14 | 7 |
    | 2021-03-15 | 8 |
    | 2021-03-16 | 9 |
    | 2021-03-17 | 5 |
    | 2021-03-18 | 0 |
    +------------+--------+



    How the lines with 0 can be merge with the second union ?

    Thanks.

    Edit:

    I tried with this query, but dates without result are not here:

    WITH recursive dates AS (
    SELECT DATE(NOW() - INTERVAL 3 MONTH) AS Date
    UNION ALL
    SELECT Date + interval 1 day
    FROM dates
    WHERE Date < DATE(NOW())
    )
    SELECT date, COALESCE(COUNT(1), 0) AS number
    FROM dates
    LEFT JOIN geo
    ON dates.date = DATE(geo.ca_time)
    WHERE departmentCode = '89'
    GROUP BY geo.ca_time
    ORDER BY geo.ca_time


    result:

    +------------+--------+
    | date | number |
    +------------+--------+
    | 2021-02-21 | 1 |
    | 2021-02-22 | 11 |
    | 2021-02-27 | 8 |
    ...

    Continue reading...

Compartilhe esta Página