2017-10-16 5 views
1

Supposons qu'il existe une table qui contient des données sur les transactions avec des dates:Postgresql: transactions Obtenir dans les données données vont

+----+------------------+ 
| 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 | 
+----+------------------+ 

Maintenant, il y a deux filtres utilisateur peut définir dans l'application: plage de données et limite des transactions. L'utilisateur doit voir le compte de toutes les transactions qui ont eu lieu plus de fois que la limite de tranasction dans la plage de données donnée. Par exemple, lorsque la limite de transactions sera fixée à 3 et la plage de données à 15 minutes, j'aurais besoin d'obtenir toutes les transactions qui ont eu lieu au moins 4 fois en 15 minutes. Donc dans le tableau ci-dessus ce sera (transaction IDs): 4, 10, 11

J'ai essayé de le faire avec l'utilisation des fonctions de la fenêtre, mais je ne pouvais pas le faire entièrement. Est-ce que quelqu'un a une idée de comment le faire?

+1

considération importante: voulez-vous dire une fenêtre de 15 minutes de glissement, ou dans un quart d'horloge ': 00-: 14', ': 15-: 29', etc? S'il y a 2 transactions à '10: 59' et deux à' 11: 01' cela correspond-il ou non? –

Répondre

0

Je ne pense pas que cela peut être réalisé par des fonctions de fenêtre, utilisez les sous-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