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.
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:
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.