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.
MyTable
? Ou são linhas distintas o suficiente? E você não precisa considerar a divisão com erro zero se não houver linhasMyTable
?Respostas:
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
o elenco para
NUMERIC
está lá para evitar a divisão inteira. O motivo da cláusula de junção é explicado 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).fonte
Isso fornece a contagem distinta (*) para A particionada por B:
fonte
A
não é nulo (pois acho que também conta nulos).abs(dense_rank - dense_rank) + 1
eu acredito.Você pode
dense_rank()
usar o valor máximo de para obter a contagem distinta de A particionada por B.Para cuidar do caso em que A pode ter valores nulos, você pode
first_value
descobrir se um nulo está presente na partição ou não e subtrair 1 se for o sugerido por Martin Smith no comentário.fonte
Tente fazer uma subconsulta, agrupando por A, B e incluindo a contagem. Em seguida, na sua consulta externa, sua contagem (distinta) se torna uma contagem regular e sua contagem (*) se torna uma soma (cnt).
fonte