Dans une base de données de transactions couvrant des milliers d'entités sur 18 mois, je voudrais exécuter une requête pour regrouper chaque période de 30 jours possible entity_id
avec un SOMME de leurs montants de transaction et COUNT de leurs transactions au cours de cette période de 30 jours, et retourner les données d'une manière que je peux ensuite interroger. Après de nombreux tests, ce code accomplit une grande partie de ce que je veux:
SELECT id, trans_ref_no, amount, trans_date, entity_id,
SUM(amount) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_total,
COUNT(id) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_count
FROM transactiondb;
Et je vais utiliser dans une requête plus large structurée quelque chose comme:
SELECT * FROM (
SELECT id, trans_ref_no, amount, trans_date, entity_id,
SUM(amount) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_total,
COUNT(id) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_count
FROM transactiondb ) q
WHERE trans_count >= 4
AND trans_total >= 50000;
Le cas que cette requête ne couvre pas, c'est quand le nombre de transactions s'étendra sur plusieurs mois, mais toujours dans les 30 jours les uns des autres. Ce type de requête est-il possible avec Postgres? Si c'est le cas, je salue toute contribution. La plupart des autres rubriques traitent de «l' exécution » des agrégats, et non du roulement .
Mise à jour
Le CREATE TABLE
script:
CREATE TABLE transactiondb (
id integer NOT NULL,
trans_ref_no character varying(255),
amount numeric(18,2),
trans_date date,
entity_id integer
);
Des exemples de données peuvent être trouvés ici . J'utilise PostgreSQL 9.1.16.
La production idéale comprendrait SUM(amount)
et COUNT()
de toutes les transactions sur une période continue de 30 jours. Voir cette image, par exemple:
Le surlignage de la date verte indique ce qui est inclus par ma requête. La surbrillance de la ligne jaune indique les enregistrements de ce que j'aimerais faire partie de l'ensemble.
Lecture précédente:
entity_id
dans une fenêtre de 30 jours à partir de chaque transaction réelle. Peut-il y avoir plusieurs transactions pour la même chose (trans_date, entity_id)
ou cette combinaison est-elle définie comme unique? Votre définition de table n'a pas de UNIQUE
contrainte PK ou PK, mais les contraintes semblent manquer ...
id
la clé primaire. Il peut y avoir plusieurs transactions par entité et par jour.
every possible 30-day period by entity_id
vous , la période peut commencer une journée, donc 365 périodes possibles en un an (non bissextile)? Ou souhaitez-vous uniquement considérer les jours avec une transaction réelle comme le début d'une période individuellement pour chacunentity_id
? Dans tous les cas, veuillez fournir votre définition de table, la version Postgres, quelques exemples de données et le résultat attendu pour l'échantillon.