J'essaie de migrer une requête d'Oracle vers SQL Server 2014.
Voici ma requête qui fonctionne très bien dans Oracle:
select
count(distinct A) over (partition by B) / count(*) over() as A_B
from MyTable
Voici l'erreur que j'ai reçue après avoir essayé d'exécuter cette requête dans SQL Server 2014.
Use of DISTINCT is not allowed with the OVER clause
Quelqu'un sait quel est le problème? Un tel type de requête est-il possible dans SQL Server? S'il vous plaît donnez votre avis.
MyTable
? Ou les lignes distinctes sont-elles suffisantes? Et vous n'avez pas besoin de considérer la division par zéro erreur s'il n'y a pas de lignesMyTable
?Réponses:
Non, il n'est pas actuellement implémenté. Voir la demande d'élément de connexion suivante.
Demande d'amélioration de clause OVER - clause DISTINCT pour les fonctions d'agrégation
Une autre variante possible serait
le casting vers
NUMERIC
est là pour éviter la division entière. La raison de la clause join est expliquée ici .Il peut être remplacé par
ON M.B = T.B OR (M.B IS NULL AND T.B IS NULL)
si préféré (ou simplementON M.B = T.B
si laB
colonne n'est pas nullable).la source
Cela donne le nombre distinct (*) pour A partitionné par B:
la source
A
uniquement lorsqu'il est non annulable (car je pense qu'il compte également les null).abs(dense_rank - dense_rank) + 1
je crois.Vous pouvez prendre la valeur maximale de
dense_rank()
pour obtenir le nombre distinct de A partitionné par B.Pour prendre en charge le cas où A peut avoir des valeurs nulles, vous pouvez utiliser
first_value
pour déterminer si un null est présent dans la partition ou non, puis soustraire 1 s'il est tel que suggéré par Martin Smith dans le commentaire.la source
Essayez de faire une sous-requête, en regroupant par A, B et en incluant le nombre. Ensuite, dans votre requête externe, votre nombre (distinct) devient un nombre normal et votre nombre (*) devient une somme (cnt).
la source