PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 15/02/2011 23:38:56

Worthatry
Membre

Histoire de count et de jointures...

Bonjour,

J'ai des connaissances SQL plutôt basiques et je bute sur une requête ; je pense que la réponse sera évidente pour une personne un tant soit peu expérimentée en SQL...

Voici les colonnes sur lesquels j'exécute ma requête (appartenant à une même table) :

event_id (int)
event_date (timestamp)
employee_id (int)
employee_request (bool)

Et voici les relations entre colonnes :

- Il y a 1 et un seul event_date par event_id
- Il y a de 1 à 8 employee_id par event_id
- Il y a  0 ou 1 employee_request par employee_id par event_id

Pour le moment, j'arrive à faire la chose suivante : créer une table affichant le nombre d'employee_request pour chaque employee_id pour chaque event_id.

Voici la requête :

select event_id, employee_id, request_cnt from events_stats as stats1 JOIN
(select employee_id, count (employee_request) as request_cnt from events_stats where employee_request = true group by employee_id) as stats2
on stats2.employee_id = stats1.employee_id

Mais voici ce que j'aimerai réaliser :

Créer une table affichant le nombre d'employee_request pour chaque employee_id pour chaque event_id, MAIS avec le count d'employee_request comptabilisant uniquement les lignes où l'event_date < event_date de l'event_id correspondant.

En fait, je souhaiterai variabiliser l'élément TIMESTAMP ci-dessous :

select event_id, employee_id, request_cnt from events_stats as stats1 JOIN
(select employee_id, count (employee_request) asrequest_cnt from events_stats where employee_request = true and event_date < (TIMESTAMP '2010-12-29 01:07:40'  - interval '1 seconds') group by employee_id) as stats2
on stats2.employee_id = stats1.employee_id

Il faudrait que le TIMESTAMP '2010-12-29 01:07:40' devienne dynamiquement stats1.event_date, ce qui est impossible à réaliser dans la sous-requête… je tourne en rond...

Merci pour votre aide !

Elise

Dernière modification par Worthatry (16/02/2011 00:26:04)

Hors ligne

#2 16/02/2011 08:02:26

Marc Cousin
Membre

Re : Histoire de count et de jointures...

Bon, déjà, une remarque: la table ressemble plutôt à un tableau excel qu'à une table de base de données. On est très loin des formes «normales», qui rendraient l'écriture de requêtes bien plus simple.
S'il y a un seul event_date par event_id, ça veut dire qu'il devrait y avoir une table event, et une table event_stats, n'ayant que event_id, employee_id, employee_request.

Je pense avoir compris ce que vous cherchez, mais désolé si je me plante smile

select event_id, employee_id, (select count(employee_request) from events_stats as tmp_count where employee_request=true and tmp_count.employee_id=main_event.employee_id and tmp_count.event_date < main_event.event_date) as main_event;

Par contre, attention, ça va être assez peu performant, puisque la sous-requête va être exécutée pour chaque enregistrement.


Marc.

Hors ligne

#3 16/02/2011 16:01:56

Worthatry
Membre

Re : Histoire de count et de jointures...

Merci pour cette réponse très rapide !

Effectivement le modèle de données n'est pas terrible mais je ne peux malheureusement pas le modifier :-/

Je pourrai tester la requête en fin de journée mais à première vue cela semble bien répondre à mon besoin ! Le fait de pouvoir appeler la table main_event depuis la sous-requête correspond à ce que j'ai cherché à faire pendant un bon moment :-)

Par contre il ne manquerait pas un "from events_stats" juste avant "as main_event" ?

select event_id, employee_id, (select count(employee_request) from events_stats as tmp_count where employee_request=true and tmp_count.employee_id=main_event.employee_id and tmp_count.event_date < main_event.event_date) as main_event;

Elise

Hors ligne

#4 16/02/2011 16:11:39

Marc Cousin
Membre

Re : Histoire de count et de jointures...

Par contre il ne manquerait pas un "from events_stats" juste avant "as main_event" ?

Si, bien sûr. J'ai pas pu la tester. Et je suis d'un naturel distrait smile


Marc.

Hors ligne

#5 16/02/2011 21:06:45

Worthatry
Membre

Re : Histoire de count et de jointures...

Je viens de tester la requête, à première vue le résultat correspond exactement à ce que je veux ! Merci encore !

Elise

Hors ligne

Pied de page des forums