2017-10-16 106 views
1

假設,有其中包含有關交易的日期數據表:PostgreSQL的:在給定的數據獲取交易範圍

+----+------------------+ 
| id | localdate  | 
+----+------------------+ 
| 1 | 2017-10-16 10:00 | 
| 2 | 2017-10-16 10:01 | 
| 3 | 2017-10-16 10:02 | 
| 4 | 2017-10-16 10:06 | 
| 5 | 2017-10-16 10:20 | 
| 6 | 2017-10-16 10:26 | 
| 7 | 2017-10-16 10:45 | 
| 8 | 2017-10-16 10:46 | 
| 9 | 2017-10-16 10:47 | 
| 10 | 2017-10-16 10:48 | 
| 11 | 2017-10-16 10:49 | 
+----+------------------+ 

現在,有兩個過濾器,用戶可以在應用程序中設置:數據範圍和交易限制。在給定的數據範圍內,用戶應該看到發生的次數多於次數限制的次數。 例如,當交易限制設置爲3,數據範圍爲15分鐘時,我需要在任何15分鐘內獲得至少4次發生的所有交易。 因此,在上表中它將是(交易ID):4,10,11

我試圖使用窗口函數,但不能完全做到這一點。有沒有人有想法如何做到這一點?

+1

重要的考慮因素:你的意思是任何滑動15分鐘窗口,或者一個時鐘季度'內:00-: 14',':15-:29'等?如果'10:59'有兩筆交易,而'11:01'有兩筆交易是匹配還是不匹配? –

回答

0

我不認爲它可以通過窗口函數來實現,使用子statments:

with data as (select unnest(tim)::timestamp tim from (select 
      array[ 
      '2017-10-16 10:00', 
      '2017-10-16 10:01', 
      '2017-10-16 10:02', 
      '2017-10-16 10:06', 
      '2017-10-16 10:20', 
      '2017-10-16 10:26', 
      '2017-10-16 10:45', 
      '2017-10-16 10:46', 
      '2017-10-16 10:47', 
      '2017-10-16 10:48', 
      '2017-10-16 10:49' 
      ] tim) a) 
     select tim from ( 
     select a.tim, (select count(1) from data where tim >= a.tim - interval '15 minutes' and tim <= a.tim and tim <> a.tim) + 1 cnt from (
     select * from data 
     ) a 
    ) a where cnt >= 4