聚合禁用窗口功能

时间:2018-04-16 21:38:46

标签: sql sql-server

我正在尝试重新编写我自己加入查询的查询:

select count(distinct case when cancelled_client_id is null and year(RUM.first_date) = year(date) and RUM.first_date <= .date then user_id 
    when cancelled_client_id is null and year(coalesce(RUM.first_date,RUR.first_date)) = year(date) 
    and coalesce(RUM.first_date,RUR.first_date) <= RUL.date then user_id end) as 
from RUL
left join 
(
select enrolled_client_id, min(date) as first_date 
from RUL
where enrolled_client_id is not null
group by enrolled_client_id 
) RUR on RUR.enrolled_client_id=RUL.enrolled_client_id
left join 
(
select managed_client_id, min(date) as first_date 
from RUL
where managed_client_id is not null
group by managed_client_id 
) RUM on RUM.managed_client_id=RUL.managed_client_id

使用窗口函数:

count(distinct case when cancelled_client_id is null
    and year(min(case when enrolled_client_id is not null then date end) over(partition by enrolled_client_id)) = year(date) 
    and min(case when enrolled_client_id is not null then date end) over(partition by enrolled_client_id) <= date 
    then user_id 
when cancelled_client_id_rev is null
    and year(coalesce(
    min(case when enrolled_client_id is not null then date end) over(partition by enrolled_client_id),
    min(case when managed_client_id is not null then date end) over(partition by managed_client_id))) = year(date) 
    and coalesce(
    min(case when enrolled_client_id is not null then date end) over(partition by enrolled_client_id),
    min(case when managed_client_id is not null then date end) over(partition by managed_client_id)) <= date 
    then user_id end) 
from RUL

但是我收到的错误是&#34;窗口函数不能在另一个窗口函数或聚合的上下文中使用&#34;由于计数(明显最小)。任何解决方法?

1 个答案:

答案 0 :(得分:1)

我不知道count(distinct)应该做什么,但您可以将代码简化为:

select count(distinct case when cancelled_client_id is null and 
                                 year(rum_first_date) = year(date) and 
                                 rum_first_date <= rul.date
                           then user_id 
                           when cancelled_client_id is null and 
                                year(coalesce(RUM_first_date, RUR_first_date)) = year(rul.date) and
                                coalesce(rum_first_date, rur_first_date) <= RUL.date
                           then user_id
              end) as . . .
from (select RUL.*,
             min(date) over (partition by enrolled_client_id) as rur_date,
             min(date) over (partition by managed_client_id) as rum_date
      from RUL
     ) RUL