2016-10-25 4 views
0

У меня есть таблица, которая хранит данные за год до даты один раз на каждого клиента в день. Схема упрощена выглядит примерно так, назового этой история таблицы ::Как создать недельную метрику в Vertica?

bus_date | client_id | ytd_costs 

Я хотел бы создать представление, которое добавляет неделю до текущей даты расходов, по существу, любой цена, которая происходит после предварительной пятницы будет считаться частью недели. В настоящее время у меня есть следующее, но я обеспокоен логикой коммутатора.

Вот пример логики, которую я имею прямо сейчас, чтобы показать, что это работает. Я также получил использовать предложение TimeSeries, который я никогда не использовал раньше ...

;with history as (
select bus_date,client_id,ts_first_Value(value,'linear') "ytd_costs" 
from (select {ts'2016-10-07'} t,1 client_id,5.0 "value" union all select {ts'2016-10-14'},1, 15) k 
timeseries bus_Date as '1 day' over (partition by client_id order by t) 
) 
,history_with_wtd as (select bus_date 
    ,client_id 
    ,ytd_costs 
    ,ytd_costs - decode(
     dayofweek(bus_date) 
     ,6,first_value(ytd_costs) over (partition by client_id order by bus_date range '1 week' preceding) 
     ,first_value(ytd_costs) over (partition by client_id,date_trunc('week',bus_date+3) order by bus_date) 
    ) as "wtd_costs" 
    ,ytd_costs - 5 "expected_wtd" 
from history) 
select * 
from history_with_wtd 
where date_trunc('week',bus_date) = '2016-10-10' 

В сервере Sql, я мог бы просто использовать функцию задержки, так как я могу передать переменную в пункте вид возврата , но в Vertica такой вариант не существует.

ответ

0

Как насчет вас разделить по неделям, начинающимся в субботу? Сначала возьмите первый день недели, а затем начните в субботу. trunc(bus_date + 1,'D') - 1

Также обратите внимание, что рамка окна находится в начале раздела (суббота, unbounded preceding) до current row.

select 
    bus_date 
    ,client_id 
    ,ytd_costs 
    ,ytd_costs - first_value(ytd_costs) over (
         partition by client_id, trunc(bus_date + 1,'D') - 1 
         order by bus_date 
         range between unbounded preceding and current row) wtd_costs 
from sos.history 
order by client_id, bus_date 
+0

Не дает правильного результата, так как ytd_cost является совокупным значением. Таким образом, если моя стоимость в пятницу была 5 долларов, а в понедельник я понес дополнительные расходы в размере 10 долларов, моя стоимость составит 15 долларов. Во вторник, если я не получу никаких дополнительных сборов, это будет еще 15 долларов. –

+0

Итак, стоимость первого дня (суббота) будет суббота минус пятница? – woot

+0

Так что бы это было не так, как раньше, за исключением того, что он использует 'first_value' и вычитает его из' ytd_costs'? Я буду обновлять запрос для этой версии. – woot