SQL Server: ¿cómo puedo usar la cláusula COUNT sin GROUPing?

Estoy buscando get dos cosas de una consulta, dado un set de contraints:

  • El primer partido
  • El número total de coincidencias

Puedo get el primer partido de la siguiente manera:

SELECT TOP 1 ID, ReportYear, Name, SignDate, ... FROM Table WHERE ... ORDER BY ... //I can put in here which one I want to take 

Y luego puedo get la count del partido si uso

 SELECT MIN(ID), MIN(ReportYear), MIN(Name), MIN(SignDate), ... , COUNT(*) as MatchCount FROM Table WHERE ... GROUP BY ??? // I don't really want any grouping 

Realmente quiero evitar agrupar y usar una function agregada en todos mis resultados. Esta pregunta SQL Server Select COUNT sin usar la function agregada o grupo sugiere que la respuesta sería

 SELECT TOP 1 ID, ReportYear, Name, SignDate, ... , @@ROWCOUNT as MatchCount FROM Table 

Esto funciona sin el TOP 1, pero cuando está allí, @@ ROWCOUNT = número de filas devueltas, que es 1. ¿Cómo puedo get esencialmente el resultado de COUNT (*) (lo que queda después de la cláusula where) sin ningún agrupamiento o ¿Necesitas agregar todas las columnas?

Lo que no quiero hacer es repetir cada una de estas dos veces, una para la primera fila y otra para la @@ ROWCOUNT. No encuentro una manera en la que pueda usar GROUP BY correctamente, porque quiero estrictamente el número de elementos que coincidan con mis criterios, y quiero columnas que, si GROUPed los arrojaría este número, a less que no entienda GROUP BY.

Suponiendo que está utilizando una versión nueva de SQL Server (2008+ de la memory), entonces puede usar funciones analíticas.

Simplificando las cosas un poco, son una manera de hacer un agregado sobre un set de datos en lugar de un grupo, una extensión en agregados básicos.

En lugar de esto:

 SELECT ... , COUNT(*) as MatchCount FROM Table WHERE ... 

Tu hiciste esto:

 SELECT ... , COUNT(*) as MatchCount OVER (PARTITION BY <group fields> ORDER BY <order fields> ) FROM Table WHERE ... GROUP BY 

Sin realmente ejecutar algún código, no puedo recordar exactamente qué agregados no puedes usar de esta manera. Sin embargo, el conteo está bien.

Bueno, puedes usar la cláusula OVER, que es una function de window.

 SELECT TOP (1) OrderID, CustID, EmpID, COUNT(*) OVER() AS MatchCount FROM Sales.Orders WHERE OrderID % 2 = 1 ORDER BY OrderID DESC 

Prueba la siguiente consulta:

 select top 1 *, count(*) over () rowsCount from ( select *, dense_rank() over (order by ValueForOrder) n from myTable ) t where n = 1