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.

Promedios móviles en SQL para los activos que se agregan progresivamente a la población.

Mi tabla de datos tiene varios activos junto con los grupos a los que pertenecen y la fecha de entrada en ese grupo/población/tabla de datos.

Ahora puedo calcular la edad promedio de los activos, pero ¿cómo puedo calcular realmente una edad promedio durante un período de tiempo? Por ejemplo, para el Grupo A, puedo calcularlo para los Activos SN 001 y SN 004, pero ¿cómo puedo obtener un promedio acumulativo desde la Fecha de Entrada y en un formato año tras año?

Me disculpo si no soy claro, estaré encantado de elaborar.

Activo Grupo Fecha de entrada
SN 001 A 2011-01-01
SN 002 B 2014-06-01
SN 003 C 2015-01-01
SN 004 A 2018-06-01
SN 005 B 2019-01-01
SN 006 C 2021-06-01

Resultado deseado: Donde # es la edad promedio y cambia en función de la adición de Activos a cada grupo y se ajusta en consecuencia.

Fecha de entrada (Año) AVG_Grupo A AVG_Grupo B AVG_Grupo C
2011 # # #
2012 # # #
2013 # # #
2014 # # #
2015 # # #
2016 # # #
2017 # # #
2018 # # #
2019 # # #
2020 # # #
2021 # # #
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para calcular un promedio de edad en ejecución para cada grupo a lo largo del tiempo, podemos utilizar una combinación de funciones SQL y funciones de ventana. Aquí hay un ejemplo de consulta utilizando la sintaxis de PostgreSQL:

    SELECT 
      EXTRACT(YEAR FROM "Date of Entry") AS "Date of Entry (Y)",
      AVG(CASE WHEN "Group" = 'A' THEN "Age" END) OVER (ORDER BY "Date of Entry" ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS "AVG_Group A",
      AVG(CASE WHEN "Group" = 'B' THEN "Age" END) OVER (ORDER BY "Date of Entry" ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS "AVG_Group B",
      AVG(CASE WHEN "Group" = 'C' THEN "Age" END) OVER (ORDER BY "Date of Entry" ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS "AVG_Group C"
    FROM (
      SELECT 
        "Asset",
        "Group",
        "Date of Entry",
        DATE_PART('YEAR', CURRENT_DATE) - DATE_PART('YEAR', "Date of Entry") AS "Age"
      FROM my_data_table
    ) subquery
    GROUP BY 1
    ORDER BY 1;
    

    Primero, utilizamos una subconsulta para calcular la edad en años de cada activo en el momento en que se agregó a la tabla de datos. Esto se hace utilizando la función DATE_PART para extraer el año de la columna “Date of Entry” y restándolo al año actual (por simplicidad, asumimos que el año actual es el año en el que se ejecuta la consulta).

    Luego, utilizamos una cláusula GROUP BY para agrupar los resultados por año y calcular el promedio de edad para cada grupo utilizando AVG y una declaración CASE para filtrar por cada grupo. Finalmente, utilizamos una función de ventana con ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW para calcular un promedio en ejecución para cada grupo a lo largo del tiempo.

    La salida resultante mostrará la edad promedio para cada grupo en cada año de la tabla de datos. Tenga en cuenta que este enfoque asume que los mismos activos permanecen en los mismos grupos a lo largo del tiempo y que se agregan nuevos activos a la tabla de datos a una tasa aproximadamente constante. Si estas suposiciones no se cumplen, los resultados pueden no reflejar con precisión la verdadera edad promedio de cada grupo a lo largo del tiempo.

Comments are closed.