Estou tentando migrar uma consulta do Oracle para o SQL Server 2014.
Aqui está minha consulta que funciona muito bem no Oracle:
select
count(distinct A) over (partition by B) / count(*) over() as A_B
from MyTable
Aqui está o erro que recebi depois de tentar executar esta consulta no SQL Server 2014.
Use of DISTINCT is not allowed with the OVER clause
Alguém sabe qual é o problema? Esse tipo de consulta é possível no SQL Server? Por favor informar.
Isso fornece a contagem distinta (*) para A particionada por B:
Não, não está implementado no momento. Consulte a seguinte solicitação de item de conexão.
Solicitação de aprimoramento da cláusula OVER - cláusula DISTINCT para funções agregadas
Outra variante possível seria
a conversão para
NUMERIC
está lá para evitar a divisão de inteiros. A razão para a cláusula join é explicada aqui .Ele pode ser substituído por
ON M.B = T.B OR (M.B IS NULL AND T.B IS NULL)
se preferir (ou simplesmenteON M.B = T.B
se aB
coluna não for anulável).Você pode pegar o valor máximo de
dense_rank()
para obter a contagem distinta de A particionada por B.Para cuidar do caso em que A pode ter valores nulos, você pode usar
first_value
para descobrir se um nulo está presente na partição ou não e, em seguida, subtrair 1 se for sugerido por Martin Smith no comentário.Tente fazer uma subconsulta, agrupando por A, B e incluindo a contagem. Então, em sua consulta externa, sua contagem(distinta) se torna uma contagem regular e sua contagem(*) se torna uma soma(cnt).
O SQL Server por enquanto não permite o uso
Distinct
com funções em janela.Mas uma vez que você se lembre de como as funções em janela funcionam (ou seja: elas são aplicadas ao conjunto de resultados da consulta), você pode contornar isso: