Vous n'êtes pas identifié(e).
Pages : 1
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
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
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
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
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
Marc.
Hors ligne
Je viens de tester la requête, à première vue le résultat correspond exactement à ce que je veux ! Merci encore !
Elise
Hors ligne
Pages : 1