Supongamos que tenemos una tabla de "Cars" con cientos de miles de filas, y que quería hacer un GROUP BY:grupo T-SQL con el Conde, y después incluir MAX a partir del recuento
SELECT CarID
, CarName
, COUNT(*) AS Total
FROM dbo.tbl_Cars
GROUP BY CarID
, CarName
La agrupación le deja con un resultado parecido a:
CarID CarName Total
1872 Olds 202,121
547841 BMW 175,298
9877 Ford 10,241
Todo bien y bien. Mi pregunta, sin embargo, es lo que es la mejor manera de conseguir el total y el total máximo en una tabla, en términos de rendimiento y codificación limpia, por lo que tiene un resultado como:
CarID CarName Total Max Total
1872 Olds 202,121 202,121
547841 BMW 175,298 202,121
9877 Ford 10,241 202,121
Un enfoque sería poner el resultado del GRUPO en una tabla temporal, y luego obtener el MAX de la tabla temporal en una variable local. Pero me pregunto cuál sería la mejor manera de hacerlo.
ACTUALIZACIÓN
La expresión de tabla común parece ser la más elegante para escribir, sin embargo similar a @EBarr, mi prueba limitada indica un rendimiento significativamente más lento. Así que no iré con el CTE.
Como el enlace @EBarr tiene para la opción COMPUTE
indica que la característica está obsoleta, esa tampoco parece ser la mejor ruta.
La opción de una variable local para el valor MAX y el uso de una tabla temporal es probable que sea la ruta que baje, ya que no soy consciente de los problemas de rendimiento con él.
Un poco más de detalle sobre mi caso de uso: probablemente podría terminar siendo una serie de otras preguntas de SO. Pero basta con decir que estoy cargando un gran subconjunto de datos en una tabla temporal (por lo que un subconjunto de tbl_Cars es entrando en #tbl_Cars, e incluso #tbl_Cars pueden filtrarse adicionalmente y tener agregaciones realizadas en él), porque Tengo que realizar múltiples filtraciones y consultas de agregación en él dentro de un único proceso almacenado que devuelve múltiples conjuntos de resultados.
ACTUALIZACIÓN 2
@ utilización de EBarr de una función de ventana es agradable y corto. Nota a uno mismo: si usa un RIGHT JOIN
en una tabla de referencia externa, la función COUNT()
debe seleccionar una columna de tbl_Cars, no '*'
.
SELECT M.MachineID
, M.MachineType
, COUNT(C.CarID) AS Total
, MAX(COUNT(C.CarID)) OVER() as MaxTotal
FROM dbo.tbl_Cars C
RIGHT JOIN dbo.tbl_Machines M
ON C.CarID = M.CarID
GROUP BY M.MachineID
, M.MachineType
En términos de velocidad, parece muy bien, pero ¿en qué punto hay que ser preocupado por el número de lecturas?
no puede utilizar 'MAX' en una vista indizada (he estado pidiéndolo durante 5 años - http://connect.microsoft.com/SQLServer/feedback/details/267516/expand-aggregate-support-in-indexed-views-min-max). Además 'theFieldBeingSearchedForMax' no está en la tabla, es parte del resultado (es el recuento más alto). –
Solo vuelve a leer la pregunta. Lo malinterpreté Actualizando SQL. – EBarr
- lo siento, no pude agregar el GROUP BY en la primera consulta; mi error. – mg1075