Я пытаюсь подсчитать таблицу за неделю, но функция 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;