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.

Agrupe datos con funciones de ventana SQL

¿Alguien podría ayudarme a resolver un problema (no es realmente un problema, pero pienso en una solución más elegante)?

Tengo una tabla con ProductionResource_id, StartDate y FinishDate. Necesito contar el número de filas, el mínimo (StartDate), el máximo (FinishDate) y el promedio en segundos entre StartDate y FinishDate. Hice una consulta con subconsultas que me dio las filas deseadas (eran dos filas con dos PersonID que trabajaron en un día) pero después de horas de ejecución. Reescribí la consulta utilizando over (partition by):

select 
   ProductionResource_id,
   a.FinishDate,
   COUNT(*) over (partition by a.ProductionResource_id) as QuantityOperations,
   avg(datediff(second, a.TaskDate, a.FinishDate) over (partition by 
     a.ProductionResource_id)) as AvgTimeOperations,
   sum(datediff(second, a.TaskDate, a.FinishDate) over (partition by 
     a.productionResource_id)) as SumTimeOperations,
   MIN(a.TaskDate) over (partition by a.productionResource_id) as BeginTimeOperations,
   max(FinishDate) over (partition by a.productionResource_id) as EndTimeOperations
from 
   hdr_MaterialPicking as a with(nolock)
where 
   a.FinishDate between @StartDate and @EndDate
group by 
   a.ProductionResource_id, 
   a.TaskDate,
   a.FinishDate,
   a.BaseQuantity,
   d.UnitKoeff,
   d.NettoWeight,
   d.UnitVolume
order by 1 asc, 2 asc

Esta consulta se ejecuta en un segundo, pero devuelve una cantidad de filas igual a COUNT(*) relacionadas con cada ProductionResource_Id. Y para obtener mis dos filas deseadas, necesito usar distinct. No me gustan las consultas con distinct, así que si hay alguna forma de reescribir esta consulta evitando distinct, pero sin que la velocidad de ejecución sea más lenta que en esta consulta.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Hola,

    Basándome en tu consulta, parece que estás intentando obtener estadísticas sobre la duración de diferentes recursos de producción que trabajan en ciertas tareas dentro de un marco de tiempo determinado. Ya has logrado reescribir tu consulta utilizando funciones de ventana, lo cual es genial ya que es más eficiente que usar subconsultas. Sin embargo, todavía estás obteniendo filas duplicadas para cada identificación de recurso de producción.

    Si entiendo correctamente, quieres obtener el recuento de identificaciones de recursos de producción únicas, en lugar del recuento total de filas por identificación. Para lograr esto, puedes modificar tu consulta utilizando la función COUNT con la palabra clave DISTINCT, de esta manera:

    SELECT 
        COUNT(DISTINCT a.ProductionResource_id) as ConteoRecursos,
        MIN(a.TaskDate) as MinFechaInicio,
        MAX(a.FinishDate) as MaxFechaFinal,
        AVG(DATEDIFF(second, a.TaskDate, a.FinishDate)) as DuracionPromedioSegundos
    FROM
        hdr_MaterialPicking as a
    WHERE
        a.FinishDate BETWEEN @FechaInicio AND @FechaFin
    GROUP BY
        a.BaseQuantity,
        d.UnitKoeff,
        d.NettoWeight,
        d.UnitVolume
    

    Esto debería darte los resultados deseados sin necesidad de la palabra clave DISTINCT o de subconsultas adicionales. Ten en cuenta que, dado que no estás agrupando por ProductionResource_id, no necesitas incluirlo en la cláusula SELECT.

    Espero que esto te ayude. Déjame saber si tienes alguna pregunta adicional.

Comments are closed.