Ich versuche, eine Abfrage von Oracle nach SQL Server 2014 zu migrieren.
Hier ist meine Abfrage, die in Oracle funktioniert:
select
count(distinct A) over (partition by B) / count(*) over() as A_B
from MyTable
Hier ist der Fehler, den ich bekommen habe, nachdem ich versucht habe, diese Abfrage in SQL Server 2014 auszuführen.
Use of DISTINCT is not allowed with the OVER clause
Weiß jemand was das Problem ist? Ist so eine Art Abfrage in SQL Server möglich? Bitte beraten.
MyTable
? Oder sind einzelne Zeilen genug? Und Sie müssen den Fehler der Division durch Null nicht berücksichtigen, wenn keine Zeilen enthalten sindMyTable
?Antworten:
Nein, es ist derzeit nicht implementiert. Siehe folgende Verbindungsanfrage.
OVER-Klausel-Erweiterungsanforderung - DISTINCT-Klausel für Aggregatfunktionen
Eine andere mögliche Variante wäre
Die Umwandlung in
NUMERIC
ist da, um eine Ganzzahldivision zu vermeiden. Der Grund für die Join-Klausel wird hier erläutert .Es kann bei Bedarf durch ersetzt
ON M.B = T.B OR (M.B IS NULL AND T.B IS NULL)
werden (oder einfach,ON M.B = T.B
wenn dieB
Spalte nicht nullwertfähig ist).quelle
Dies ergibt die eindeutige Anzahl (*) für A, dividiert durch B:
quelle
A
es nur nicht nullbar ist (da ich denke, dass es auch nulls zählt).abs(dense_rank - dense_rank) + 1
ich glauben.Sie können den Maximalwert von verwenden
dense_rank()
, um die eindeutige Anzahl von A abzurufen, die durch B partitioniert ist.Um sich um den Fall zu kümmern, dass A Nullwerte haben kann, können Sie
first_value
herausfinden, ob in der Partition eine Null vorhanden ist oder nicht, und dann 1 abziehen, wenn dies von Martin Smith im Kommentar vorgeschlagen wurde.quelle
Versuchen Sie, eine Unterabfrage zu erstellen, die nach A, B gruppiert und die Anzahl einschließt. In Ihrer äußeren Abfrage wird Ihre Zählung (distinct) zu einer regulären Zählung und Ihre Zählung (*) wird zu einer Summe (cnt).
quelle