Estoy tratando de migrar una consulta de Oracle a SQL Server 2014.
Aquí está mi consulta que funciona muy bien en Oracle:
select
count(distinct A) over (partition by B) / count(*) over() as A_B
from MyTable
Aquí está el error que recibí después de intentar ejecutar esta consulta en SQL Server 2014.
Use of DISTINCT is not allowed with the OVER clause
Alguien sabe cuál es el problema? ¿Es posible este tipo de consulta en SQL Server? Por favor avise.
MyTable
? ¿O son suficientes filas distintas? ¿Y no necesita considerar el error de división por cero si no hay filasMyTable
?Respuestas:
No, actualmente no está implementado. Consulte la siguiente solicitud de elemento de conexión.
Solicitud de mejora de la cláusula OVER: cláusula DISTINCT para funciones agregadas
Otra posible variante sería
el elenco
NUMERIC
está allí para evitar la división de enteros. El motivo de la cláusula join se explica aquí. .Se puede reemplazar con
ON M.B = T.B OR (M.B IS NULL AND T.B IS NULL)
si se prefiere (o simplementeON M.B = T.B
si laB
columna no es anulable).fuente
Esto proporciona el recuento distinto (*) para A particionado por B:
fuente
A
no es anulable (ya que creo que también cuenta nulos).abs(dense_rank - dense_rank) + 1
, creo.Puede tomar el valor máximo de
dense_rank()
para obtener el recuento distintivo de A particionado por B.Para ocuparse del caso en el que A puede tener valores nulos, puede usar
first_value
para determinar si un nulo está presente en la partición o no y luego restar 1 si es como lo sugirió Martin Smith en el comentario.fuente
Intente hacer una subconsulta, agrupando por A, B e incluyendo el recuento. Luego, en su consulta externa, su recuento (distinto) se convierte en un recuento regular y su recuento (*) se convierte en una suma (cnt).
fuente