2017-01-03 2 views
2

Я пытаюсь подсчитать таблицу за неделю, но функция DATE_TRUNCT('week',date) рассматривает понедельник как начало недели, но мне нужно, чтобы неделя началась в воскресенье.Группа по неделям на Redshift

Это запрос, который работает нормально, но с началом в понедельник ...

SELECT DATE_TRUNC('week',myDate) AS Reference, 
     column1 AS Item1, 
     column2 AS Item2, 
     COUNT(*) AS Volume, 
     COUNT(CASE WHEN status = 'status1' THEN 1 END) AS Status1, 
     COUNT(CASE WHEN status = 'status2' THEN 1 END) AS Status2, 
     COUNT(CASE WHEN status = 'status2' AND fase = '1' THEN 1 END) AS Fase1, 
     COUNT(CASE WHEN status = 'status2' AND fase = '2' THEN 1 END) AS Fase2, 
     COUNT(CASE WHEN status = 'status2' AND fase = '3' THEN 1 END) AS Fase3 
FROM myTable 
WHERE DATE_TRUNC('week',myDate) = DATE_TRUNC('week',TO_DATE('12/25/2016 00:00:00','MM/dd/yyyy')) 
GROUP BY 1, 
     2, 
     3; 

До сих пор я только попробовал другой запрос, который не делает даже бежать, и я не знаю, почему, он просто говорит: «ошибка синтаксиса или вблизи «целое»:

SELECT DATE_TRUNC('week',myDate) - integer '1' AS Reference, 
     column1 AS Item1, 
     column2 AS Item2, 
     COUNT(*) AS Item3, 
     COUNT(CASE WHEN status = 'status1' THEN 1 END) AS Status1, 
     COUNT(CASE WHEN status = 'status2' THEN 1 END) AS Status2, 
     COUNT(CASE WHEN status = 'status2' AND fase = '1' THEN 1 END) AS Fase1, 
     COUNT(CASE WHEN status = 'status2' AND fase = '2' THEN 1 END) AS Fase2, 
     COUNT(CASE WHEN status = 'status2' AND fase = '3' THEN 1 END) AS Fase3 
FROM myTable 
WHERE myDate between (DATE_TRUNC('week', TO_DATE('12/25/2016 00:00:00','MM/dd/yyyy') - integer '1') and (DATE_TRUNC('week', TO_DATE('12/25/2016 00:00:00','MM/dd/yyyy')) + integer '5') 
GROUP BY 1, 
     2, 
     3; 

Кроме того, даже если этот запрос запущенной propely, он будет показывать количество недели 18/Дек - 24/декабрь, а не за неделю 25/декабря - 31/дек в дело 25/Dec. То же самое произойдет в другие дни, если они воскресны.

EDIT: Я только что нашел решение в этом блоге: https://blog.modeanalytics.com/date-trunc-sql-timestamp-function-count-on/ Он вводил функцию date_trunct, и кто-то задал тот же вопрос в комментариях. Это мой разрешенный запрос для будущих ссылок на другие:

SELECT date_trunc('WEEK',(myDate + interval '1 day'))- interval '1 day' AS Reference 
     column1 AS Item1, 
     column2 AS Item2, 
     COUNT(*) AS Volume, 
     COUNT(CASE WHEN status = 'status1' THEN 1 END) AS Status1, 
     COUNT(CASE WHEN status = 'status2' THEN 1 END) AS Status2, 
     COUNT(CASE WHEN status = 'status2' AND fase = '1' THEN 1 END) AS Fase1, 
     COUNT(CASE WHEN status = 'status2' AND fase = '2' THEN 1 END) AS Fase2, 
     COUNT(CASE WHEN status = 'status2' AND fase = '3' THEN 1 END) AS Fase3 
FROM myTable 
WHERE (date_trunc('WEEK',(myDate + interval '1 day'))- interval '1 day') = (DATE_TRUNC('week',TO_DATE('12/24/2016 00:00:00','MM/dd/yyyy') + interval '1 day' ) - interval '1 day') 
GROUP BY 1, 
     2, 
     3; 

ответ

2

Я не мог найти простой способ установить неделю с воскресенья по субботу. Но вы можете попробовать это:

select date_trunc('week', myDate + 1) - 1 as Reference, 
     ... 
from myTable 
where ... 
group by date_trunc('week', myDate + 1), ... 

Хитрость здесь просто смещаются на один день, делая group by.

Смежные вопросы