2017-03-09 62 views
2

與像一個PostgreSQL 9.6表結構:分鐘之間PostgreSQL的最大值在

who | when 

每天有相同和不同多個記錄。 專注於每個記錄是動作爲誰要,所以需要爲每個誰獲得總時間。

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 

我怎樣才能在總的小時?

我認爲max(when) - min(when)得到週期,但需要減去計算中間最小值和最大值的中間數據。

所以需要得到作爲12:00「morningout」和13:00爲「afternoonin」但是當我把betweeen最小最大在它抱怨

「沒有聚合函數可能在」

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

通常情況下,您將WHERE放在FROM和GROUP BY之間。對於聚合函數條件,您需要一個HAVING子句。 – jarlh

+0

什麼時候在the_table的最大值(when)和min(when)之間? –

回答

2

你可以用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 

如果您每天需要,只需使用group by條款中的date_trunc('day', "when")即可。你也可以把date_trunc('day', "when")partition by子句中,窗口定義裏面,以避免配對橫跨天跨越:

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") 

然而,這些解決方案需要的行必須在 + 對。要獲得更可靠的解決方案,您需要一個direction列。

http://rextester.com/UJWWH59178