2017-01-03 9 views
2

Ich versuche, meine Tabelle nach Woche zu zählen, aber die DATE_TRUNCT('week',date) Funktion betrachtet Montag als Anfang der Woche, aber ich brauche für die Woche in Sonntag beginnen.Gruppe nach Woche auf Redshift

Dies ist die Abfrage, die richtig läuft, aber mit in Mondays ... ab

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; 

Bisher habe ich nur eine weitere Abfrage versucht, die selbst und ich weiß nicht laufen tut, warum, es sagt nur „Syntaxfehler an oder in der Nähe von "integer":

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; 

auch wenn diese Abfrage propely runned, würde es die Zählung der Woche 18/Dec zeigen - 24/Dec und nicht die Woche 25/Dec - 31/Dec in der Fall 25/Dez. Das gleiche würde in anderen Tagen geschehen, wenn sie Sonntage sind.

EDIT: Ich habe gerade die Lösung in diesem Blog gefunden: https://blog.modeanalytics.com/date-trunc-sql-timestamp-function-count-on/ Es wurde die date_trunct Funktion eingeführt und jemand fragte die gleiche Frage in den Kommentaren. Dies ist meine gelöste Abfrage für zukünftige Referenz zu anderen:

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; 

Antwort

2

Ich konnte keine einfache Möglichkeit finden, Woche als Sonntag bis Samstag einzustellen. Aber man kann versuchen, diese:

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

Der Trick hier nur um einen Tag verschoben wird, während group by tun.