2014-12-19 2 views
6

Я написал это и успешно выполняется в OracleCount (Distinct ([значение)) OVER (Partition по) в 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 

Я пытаюсь добиться того же результата в SQL Server (наш исходная база данных использует Oracle, но наш склад использует SQL Server).

Я знаю, что ядро ​​не поддерживается функциями окна в SQL Server 2008 - может ли кто-нибудь предложить альтернативу?

+0

На сайте дБА [Вы можете использовать COUNT DISTINCT с пунктом OVER?] (Http://dba.stackexchange.com/a/76761/3690) –

ответ

4

Вот что я недавно встретил. Я получил это от post. Пока это работает очень хорошо для меня.

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, спасибо! –

+0

Включает значения «NULL», тогда как «COUNT()» - нет. –

9

Увы, вы не можете сделать count(distinct) over в SQL Server. Вы можете сделать это с помощью подзапроса. Идея состоит в том, чтобы перечислить значения в каждом коде курса (и подчиняться другим условиям разбиения). Затем просто подсчитайте значения, где порядковый номер 1:

select sum(case when cc_seqnum = 1 then 1 else 0 end) as APE_COURSES_PER_ACADEMIC_YEAR 
from (select . . . , 
      row_number() OVER (PARTITION BY s.REGISTRATION_NUMBER, APEC.APE_ID, 
               COV.ACADEMIC_SESSION, 
               APEC.COURSE_CODE 
           ORDER BY (SELECT NULL) 
           ) as cc_seqnum 
     from . . . 
    ) t 

У вас есть сложный запрос. Я предлагаю заменить count(distinct) на row_number() и сделать ваш текущий запрос подзапросом или CTE для окончательного запроса.

Смежные вопросы