2017-05-29 4 views
-1

Ich habe dieses Feld mit dem Namen late_in, die Daten wie diese 2017.05.29 08.36.44 enthält, wo die Grenze für den Eintritt Zeit 08.30.00 ist jeden Tag.PostgreSQL zählen, wie viele spät jeden Monat in einem Jahr

Was ich tun möchte, ist das Jahr, den Monat und wie oft er zu spät in diesem Monat, auch wenn es Null spät im Monat zu bekommen.

Ich mag das Ergebnis in etwa so aussehen:

year month late 
------------------- 
2017 1  6 
2017 2  0 
2017 3  14 

und bis zum Ende des Jahres fortsetzen.

+0

Was Du meinst "Begrenzung für die Einreisezeit ist 08:30:00 jeden Tag". Wie wirkt sich das auf das erwünschte Ergebnis aus? –

+0

ich mein Büro Eintrittszeit bedeuten 08.30.00 ist so mehr als das so spät zählen wird – Faiz

Antwort

2

Sie suchen bedingte Aggregation:

select extract(year from late_in) as year, 
     extract(month from late_in) as month, 
     count(*) filter (where late_in::time > time '08:30:00') as late 
from the_table 
group by extract(year from late_in), 
     extract(month from late_in); 

Dies setzt voraus, dass late_in als timestamp definiert ist.

Der Ausdruck late_in::time gibt nur die Zeit des Werteteils und die filter() Klausel für die Aggregation nur in den Reihen führen wird gezählt, wenn die Bedingung erfüllt ist, dh wenn die Teilzeit ist nach 08:30

+0

Ich denke, müssen Sie wo statt, wenn nach dem Filter. Und entferne Auswahl nach Gruppe nach. –

+0

danke. funktioniert super. Aber ist es möglich, einen vollen Monat des Jahres zu zeigen, auch wenn es 0 spät für den Monat? – Faiz

+0

@Faiz: dass eine Null-Zählung zeigen, es sei denn, es für diesen Monat überhaupt keine Zeile in der Tabelle ist. –