2017-03-09 3 views
2

mit einer Postgresql 9.6 Tabellenstruktur wie:Postgresql zwischen min max in den

who | when 

Jeden Tag hat mehrere Datensätze mit gleichen den und verschiedenen wenn. Ipotsetically jeder Datensatz ist ein in oder aus Aktion für Wer, so müssen die Gesamtzeit in für jeden, wer.

heißt

who | when 
    A | 2017-03-01 08:00 
    A | 2017-03-01 12:00 
    A | 2017-03-01 13:00 
    A | 2017-03-01 15:00 

wie kann ich in den insgesamt Stunden bekommen?

Ich denke, dass max (wann) - min (wann) die Periode erhält, aber die mittleren Daten subtrahieren müssen, mittlere min und max.

So müssen die 00.00 als ‚morningout‘ und 13.00 Uhr als ‚afternoonin‘ zu bekommen, aber wenn ich legte den betweeen min max in dem es klagt

‚keine Aggregatfunktion möglich in dem‘

select who, 
     to_char(date_trunc('day', when), 'YYYY-MM-DD') "thisday", 
     count(who) as 'signIn' 
     min(when) as 'morningout'   
     max(when) as 'afternoonin' 


from the_table 
where when between max(when) and min(when) 

group by who, "thisday" 
order by who; 
+0

Normalerweise setzen Sie WHERE zwischen FROM und GROUP BY. Für Aggregatfunktionsbedingungen benötigen Sie stattdessen eine HAVING-Klausel. – jarlh

+0

Wann ist zwischen max (wann) und min (wann) für jeden Zeitpunkt der Tabelle? –

Antwort

2

Sie können dies mit window functions:

select who, 
     sum("when" - lag) 
from  (select row_number() over w, 
       who, 
       "when", 
       lag("when") over w 
      from t 
      window w as (partition by who order by "when")) d 
where row_number % 2 = 0 
group by who 

Wenn Sie diese pro Tag benötigen, verwenden Sie einfach die date_trunc('day', "when") in der group by Klausel. Sie können auch setzen date_trunc('day', "when") in der partition by Klausel, in der Fensterdefinition Paarung zu vermeiden, die über Tage erstreckt:

select who, 
     date_trunc('day', "when"), 
     sum("when" - lag) 
from  (select row_number() over w, 
       who, 
       "when", 
       lag("when") over w 
      from t 
      window w as (partition by who, date_trunc('day', "when") order by "when")) d 
where row_number % 2 = 0 
group by who, date_trunc('day', "when") 

Jedoch erfordern diese Lösungen, dass Zeilen in in + aus Paaren sein. Für eine zuverlässigere Lösung benötigen Sie eine direction Spalte.

http://rextester.com/UJWWH59178