es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Suma acumulativa de Mysql agrupada por nombre y fecha

Tenía una tarea en la que debía acumular dos fechas diferentes, lo cual hice con la siguiente consulta:

with cte as (
select p.starteddate as CD,
(select count(*) from TABLE t1 where p.starteddate=t1.starteddate) Started,
(select count(*) from TABLE t1 where p.starteddate=t1.updateddate) Updated
from TABLE p
group by CD, Started, Updated
)
select
 CD,
  sum(Started) over (order by CD asc rows between unbounded preceding and current row) as Started,
  sum(Updated) over (order by CD asc rows between unbounded preceding and current row) as Updated
from cte
order by CD desc;

Ahora, tengo que agregar más valores a esa consulta en la que me he quedado atascado.
1) La consulta debe tener en cuenta los nombres y acumular solo las fechas por cada nombre. Dado que hay alrededor de 11 nombres, supongo que la mejor opción sería recuperar los nombres primero con una consulta DISTINCT, pero no tengo idea de cómo seguir aquí.
2) Solo se debe tener en cuenta el Tipo A.
3) También, dado que hay 1000 filas y contando, y las fechas se remontan a un año, solo se deben tener en cuenta los últimos 60 días.

¡Gracias!

Tabla de ejemplo:

Type Startdate updateddate name
A 12/01/21 12/01/21 D
A 11/01/21 12/01/21 D
A 13/01/21 13/01/21 E
A .
A 07/01/21 11/01/21 E
A 12/01/21 14/01/21 E
A .
A 14/01/21 14/01/21 G
A 12/01/21 12/01/21 D
A 11/01/21 12/01/21 D
A 13/01/21 13/01/21 E
A .
A 07/01/21 11/01/21 E
A 12/01/21 14/01/21 E
A 14/01/21 null G
A 11/01/21 11/01/21 F
A 14/01/21 15/01/21 G

Resultado esperado:

Name Date Count Start Count Updated
E 07/01/21 2 0
E 11/01/21 2 2
E 12/01/21 4 2
E 13/01/21 6 4
D 11/01/21 2 0
D 12/01/21 4 4
G 14/01/21 3 1
G 15/01/21 3 2
F 11/01/21 1 1
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado esperado, necesitas modificar la consulta actual para incorporar los requisitos adicionales. Así es como puedes modificar la consulta existente:

    con cte as (
      select 
        name, 
        starteddate as date, 
        count(*) filter (where type = 'A') as start_count, 
        count(*) filter (where type = 'A' and updateddate is not null) as update_count
      from table
      where type = 'A' and starteddate >= current_date - interval '60 days'
      group by name, date
    )
    select
      name,
      date,
      sum(start_count) over (partition by name order by date asc rows between unbounded preceding and current row) as count_start,
      sum(update_count) over (partition by name order by date asc rows between unbounded preceding and current row) as count_update
    from cte
    order by name asc, date desc;
    

    Desglosemos los cambios:

    1. En la subconsulta (cte), primero filtramos los registros solo para Tipo A y dentro de los últimos 60 días. También reemplazamos starteddate por date para simplificar los nombres de las columnas.
    2. Agrupamos los registros por name y date y calculamos start_count y update_count para cada grupo. Utilizamos la función filter para contar solo los registros relevantes.
    3. En la consulta principal, modificamos la cláusula partition by para particionar por name en lugar de CD. Esto asegurará que la función sum sume acumulativamente los recuentos para cada nombre individual.
    4. También actualizamos los nombres de las columnas en la cláusula select para que coincidan con el resultado esperado.

    Con estos cambios, la consulta debería generar el resultado esperado.

Comments are closed.