2017-01-27 4 views
0

Можно делать кумулятивное умножение (ниже запроса) с оконными функциямиНакопительное умножение функций окна ехр 'не является допустимым оконная функция

select Id, Qty 
    into #temp 
    from(
      select 1 Id, 5 Qty 

      union 

      select 2, 6 

      union 

      select 3, 3 
    )dvt 

    select 
    t1.Id 
    ,exp(sum(log(t2.Qty))) CumulativeMultiply 
    from #temp t1 
    inner join #temp t2 
     on t2.Id <= t1.Id 
    group 
    by t1.Id 
    order 
    by t1.Id 

Как:

select 
     t1.Id 
     ,exp(sum(log(t2.Qty))) over (partition by t1.Id order by t1.Id rows between unbounded preceding and current row) CumulativeMultiply 
     from #temp t1 
     inner join #temp t2 
      on t2.Id <= t1.Id 

Но получаю ошибку :

The function 'exp' is not a valid windowing function, and cannot be used with the OVER clause

Обновление: Результат, который на самом деле я хочу:

Id   CumulativeMultiply 
----------- ---------------------- 
1   5 
2   30 
3   90 
+1

Вы только что ошиблись в своем брекетинге - вы хотите, чтобы «OVER» применялся к 'SUM', поэтому он должен быть * внутри * скобками для' EXP'. –

+0

'exp()' не является агрегатом, поэтому он не может использоваться как функция окна –

ответ

0

нет необходимости себя не присоединиться к Sum Over(Order by) найти предыдущие записи и умножить его

select 
     Id 
     ,exp(sum(log(Qty)) 
     over (order by Id)) CumulativeMultiply from #temp 
0

Только функции агрегации действительны для оконных функций.

Я не проверял код, но вы должны отделить 2 таким образом:

SELECT Id, exp(cm) CumulativeMultiply 
FROM (
select 
     Id 
     ,sum(log(Qty)) over (partition by Id order by Id rows between unbounded preceding and current row) cm 
     from #temp 
) d 
+2

'Sum Over (Order by)' не требует самостоятельного объединения, чтобы найти предыдущие записи и умножить его. –

+0

@Prdp исправьте меня, если я worng ... Я думаю, мы не можем использовать порядок в случае агрегатных оконных функций ... например, сумма (порядок), подсчет (порядок) ... и т. Д. я прав? – balaji

+0

@balaji Вы можете использовать ORDER BY с SUM, и, хотя обычно это не имеет никакого смысла, тогда, когда вы работаете, вам нужно указать порядок строк. –