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