2017-10-16 153 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