2014-12-19 8 views
6

ich dieses geschrieben habe und erfolgreich ausgeführt in OracleCount (Distinct ([value)) OVER (Partition von) in SQL Server 2008

COUNT (DISTINCT APEC.COURSE_CODE) OVER (
              PARTITION BY s.REGISTRATION_NUMBER 
              ,APEC.APE_ID 
              ,COV.ACADEMIC_SESSION 
              ) APE_COURSES_PER_ACADEMIC_YEAR 

Ich versuche, das gleiche Ergebnis in SQL Server zu erreichen (unser Quelldatenbank verwendet Oracle, aber unser Warehouse verwendet SQL Server).

Ich weiß das distinct wird nicht mit Fensterfunktionen in SQL Server 2008 unterstützt - kann jemand eine Alternative vorschlagen?

+0

Auf der dba-Website [Können Sie COUNT DISTINCT mit einer OVER-Klausel verwenden?] (Http://dba.stackexchange.com/a/76761/3690) –

Antwort

4

Hier ist, was ich vor kurzem gestoßen bin. Ich habe es von dieser post. Bis jetzt funktioniert es wirklich gut für mich.

DENSE_RANK() OVER (PARTITION BY PartitionByFields ORDER BY OrderByFields ASC) + 
DENSE_RANK() OVER (PARTITION BY PartitionByFields ORDER BY OrderByFields DESC) - 1 AS DistinctCount 
+0

GREAT, Thank you! –

+0

Dies beinhaltet 'NULL' Werte, während' COUNT() 'nicht gilt. –

9

Leider können Sie count(distinct) over in SQL Server nicht tun. Sie können dies mit einer Unterabfrage tun. Die Idee besteht darin, die Werte innerhalb jedes Kurscodes aufzuzählen (und den anderen Partitionierungsbedingungen unterworfen). Dann zählen Sie einfach die Werte mit der Sequenznummer 1:

Sie haben eine komplexe Abfrage. Ich würde vorschlagen, dass Sie die count(distinct) durch die row_number() ersetzen und Ihre aktuelle Abfrage eine Unterabfrage oder CTE für die endgültige Abfrage machen.