Настройка диапазона недели с помощью date_trunc - PullRequest
0 голосов
/ 24 сентября 2019

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

Так что-то вроде

SELECT
DATE_TRUNC(...) sales_week,
SUM(sales) sales
FROM table
GROUP BY 1
ORDER BY 1 DESC

Что даст результаты за последнюю завершенную неделю (по этим стандартам) как 09-13-2019.

Ответы [ 3 ]

1 голос
/ 24 сентября 2019

Вы можете вычесть 4 дня, а затем добавить 4 дня:

SELECT DATE_TRUNC(<whatever> - INTERVAL '4 DAY') + INTERVAL '4 DAY' as sales_week,
       SUM(sales) as sales
FROM table
GROUP BY 1
ORDER BY 1 DESC
0 голосов
/ 26 сентября 2019

если по какой-либо причине у вас могут быть пробелы в данных (возможно, более детальные разбивки по сравнению с неделями), вы можете сгенерировать набор пользовательских недель и присоединиться к ним:

drop table if exists sales_weeks;
create table sales_weeks as
with 
 dates as (
    select generate_series('2019-01-01'::date,current_date,interval '1 day')::date as date
)
,week_ids as (
    select 
     date
    ,sum(case when extract('dow' from date)=5 then 1 else 0 end) over (order by date) as week_id
    from dates
)
select 
 week_id
,min(date) as week_start_date
,max(date) as week_end_date
from week_ids 
group by 1
order by 1
;
0 голосов
/ 24 сентября 2019

Выражение

select current_date - cast(cast(7 - (5 - extract(dow from current_date)) as text) || ' days' as interval);

всегда должно указывать дату предыдущей пятницы.

...