2016-09-03 7 views
1

Ich habe ein bisschen eine ungewöhnliche Frage. Ich verwende Python, um einige Daten in eine Textdatei zu schreiben, mit der ich dann Tableau zum Lesen und Erstellen von Visualisierungen verwende. Ich gruppiere die Abfrageergebnisse nach Wochen, um die Größe der Ausgabedatei zu reduzieren. Ich denke, das SQL ist ziemlich Standard für diese Art von Operation.Netezza Gruppierung nach Woche Start (Sonntag) UND Monat Start

SELECT [Date] - EXTRACT(DOW FROM [Date]) + 1 
[this gives me the Sunday of the week for any date] 

Allerdings mag ich gelegentlich zu einer Gruppe von Monaten statt Wochen, die mit dem Stromausgang unmöglich ist. Was ich will, ist eine Änderung an der Abfrage, die nach Woche gruppiert wird, AUSSER wenn eine Woche zwei Monate überlappt. Wenn sich die Woche über zwei Monate erstreckt, werden die Ergebnisse in den ersten Teil der Woche im ersten Monat und dann in den zweiten Teil der Woche im zweiten Monat aufgeteilt. Auf diese Weise können wir die Ausgabe verwenden, um das wöchentliche Ergebnis ODER die monatlichen/vierteljährlichen/jährlichen Ergebnisse anzuzeigen, indem einfach die Daten in Tableau gruppiert werden.

Hat jemand schon einmal ein Problem wie dieses angegangen?

Betrachten Sie zur Veranschaulichung die folgenden Werte.

2016-08-21 1 
2016-08-22 1 
2016-08-23 1 
2016-08-24 1 
2016-08-25 1 
2016-08-26 1 
2016-08-27 1 
2016-08-28 1 
2016-08-29 1 
2016-08-30 1 
2016-08-31 1 
2016-09-01 1 
2016-09-02 1 
2016-09-03 1 
2016-09-04 1 
...   ... 

würde ich den Code Ausgabe wie die folgenden Werte:

2016-08-21 7 
2016-08-28 4 
2016-09-01 3 
2016-09-04 1... 

Wäre wirklich zu schätzen jede Hilfe!

+0

Laden Sie diese Daten auf Tableau in Tableau und führen Sie dort die Datumsmanipulation durch. –

+0

Ja, das ist eine Option, aber ich versuche es aufgrund der Datenmenge zu vermeiden. Eine Gruppierung nach Woche/Monat würde dazu führen, dass die Datendatei Tableau 1/6 der Größe verarbeitet (oder so ähnlich, nicht sicher über den genauen Wert, aber es wäre viel kleiner). – SeaChange

Antwort

2

Basierend auf googled Netzetta syntax, könnte dies funktionieren:

select 
min([Date]) as MinDate, count(*) as TotalDays 
from YourTable 
group by 
extract(year from [Date]), 
extract(month from [Date]), 
(case 
when extract(dow from [Date]) = 1 -- dow 1 is sunday 
then extract(week from [Date]) + 1 -- week starts on monday 
else extract(week from [Date]) 
end); 

Oder wie es in den Kommentaren vorgeschlagen, Gruppe am Sonntag:

select 
min([Date]) as MinDate, count(*) as TotalDays 
from YourTable 
group by 
([Date] - (extract(dow from [Date]) - 1)); 
+0

Ja, ich weiß nicht, warum es nicht so war dämmern Sie an mich, um das Datum nur nach Minimum zu aggregieren und dann nach Monat und Woche zu gruppieren. Habe es noch nicht getestet, aber folgendes sollte funktionieren: GROUP BY EXTRACT (MONAT VON [Datum]), [Datum] - EXTRACT (DOW VON [Datum]) + 1 – SeaChange

+0

Gruppierung nur am Sonntag ist auch eine gültige und gerade kürzere Methode. Der Golfcoder in mir stimmt;) Ich habe es der Antwort hinzugefügt. – LukStorms

0

Hier ist der endgültige Code, die ich verwendet.

CASE 
WHEN EXTRACT(MONTH FROM [Date]) <> EXTRACT(MONTH FROM [Date] - EXTRACT(DOW FROM [Date]) + 1) 
THEN DATE_TRUNC('month', [Date]) 
ELSE [Date] - EXTRACT(DOW FROM [Date]) + 1 END 

Dann habe ich auf diesem Feld gruppiert. Die Funktionsweise ist, dass überprüft wird, ob der Monat des Datums dem Monat der Woche entspricht. Ist dies nicht der Fall, wird der erste Tag des Monats zurückgegeben. Ist dies der Fall, wird der Start der Woche zurückgegeben. Dieser Code gibt die Werte des Beispiels aus dem ursprünglichen Post zurück.

Verwandte Themen