Count (Distinct ([value)) OVER (Partition by) в SQL Server 2008

Я написал это и успешно выполнил в Oracle

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).

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

2 ответов


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

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

увы, вы не можете сделать 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 для окончательного запроса.