一千萬個為什麽

搜索

Postgresql之間最小的最大值在哪裏

與Postgresql 9.6表結構一樣:

who | when

每天有多個記錄,時不同。 對於 who ,每個記錄都是 或輸出動作,因此需要為每個人獲取總時間。

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

我怎樣才能獲得 6 小時的總數?

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

因此,需要將12:00作為“上午”和13:00作為“下午”,但是當我將min min之間設置為投訴的位置時

'沒有聚合函數可能在'

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;

最佳答案

您可以使用窗口功能執行此操作:

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”)放入分區中,以避免跨越幾天跨越:

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

但是,這些解決方案要求行必須位於 + out 對中。為了獲得更可靠的解決方案,您需要一個方向列。

http://rextester.com/UJWWH59178

轉載註明原文: Postgresql之間最小的最大值在哪裏