requete sql complexe

requete sql complexe - SQL/NoSQL - Programmation

Marsh Posté le 01-03-2006 à 13:49:04    

Bonjour à tous,  
 
voici ma table:  
 
 
bug---------date_modified-----------------old_value------new_value  
 
140---------01/02/2005 14:36:54---------10--------------15  
140---------02/02/2005 09:50:16---------15--------------20  
140---------02/02/2005 12:07:36---------20--------------30  
140---------02/02/2005 17:44:15---------30--------------20  
140---------03/02/2005 13:43:23---------20--------------30  
140---------22/02/2005 11:09:37---------30--------------45  
140---------24/02/2005 18:33:05---------45--------------80  
140---------04/03/2005 12:23:50---------80--------------90  
140---------29/03/2005 15:05:40---------90--------------20  
140---------29/03/2005 15:05:50---------20--------------15  
140---------29/03/2005 15:11:25---------15--------------20  
140---------09/06/2005 16:42:45---------20--------------30  
140---------15/06/2005 11:39:25---------30--------------20  
140---------29/06/2005 11:18:17---------20--------------30  
140---------29/07/2005 10:12:38---------30--------------45  
140---------18/08/2005 18:29:47---------45--------------80  
140---------10/10/2005 12:17:49---------80--------------45  
140---------20/10/2005 11:24:58---------45--------------40  
140---------20/10/2005 11:25:20---------40--------------45  
140---------17/01/2006 16:44:08---------45--------------80  
140---------06/02/2006 10:15:46---------80--------------90  
 
 
voici ce que je voudrais faire:  
 
je voudrais, pour une plage de date donnée, regarder si le bug est en 80 ou en 90 à la fin de la plage de date.  
donc pour  
 
140---------22/02/2005 11:09:37---------30--------------45  
140---------24/02/2005 18:33:05---------45--------------80  
140---------04/03/2005 12:23:50---------80--------------90  
140---------29/03/2005 15:05:40---------90--------------20  
 
je ne veux pas récupérer le bug  
 
par contre pour  
 
140---------22/02/2005 11:09:37---------30--------------45  
140---------24/02/2005 18:33:05---------45--------------80  
140---------04/03/2005 12:23:50---------80--------------90  
 
je veux récupérer le bug  
 
mais, si je récupère le bug il me faut la date la plus ancienne pour 80 et 90, c'est à dire que si le bug est 80 puis 90 je dois récupérer la date du premier (80)  
 
ex:  
140---------22/02/2005 11:09:37---------30--------------45  
140---------24/02/2005 18:33:05---------45--------------80  
140---------04/03/2005 12:23:50---------80--------------90  
 
je récupère 24/02/2005  
 
meme chose si:  
 
140---------22/02/2005 11:09:37---------30--------------45  
140---------24/02/2005 18:33:05---------45--------------80  
140---------03/03/2005 12:23:50---------80--------------90  
140---------04/03/2005 12:23:50---------90--------------80  
 
je veux récupérer 24/02/2005  
 
et tout ceci dans une requete SQL .
 
résumé:
sur une durée donnée, si la dernière date_modified n'a pas une new_value à 80 ou 90 alors je ne compte pas le bug_id dans mon nombre de bug  
si par contre la new_value est à 80 ou 90 alors il faut que je regarde si la new_value d'avant est à 80 ou 90 et si la new value d'avant avant est à 80 ou 90 ... et prendre la date_modified du tout premier 80 ou 90
 
 
Merci de votre aide.

Reply

Marsh Posté le 01-03-2006 à 13:49:04   

Reply

Marsh Posté le 01-03-2006 à 13:55:59    

t'as écrit quoi pour l'instant?  
Et avec ça, quels sont les problèmes?

Reply

Marsh Posté le 01-03-2006 à 14:12:48    

anapajari a écrit :

t'as écrit quoi pour l'instant?  
Et avec ça, quels sont les problèmes?


 
pour l'instant j'ai écrit ça:
 

Code :
  1. SELECT Requête3.bug_id, Last(Requête3.date_modified) AS DernierDedate_modified
  2. FROM Requête3
  3. WHERE (((Requête3.date_modified) Between #10/1/2005# And #19/1/2005#) AND ((Requête3.new_value)="80" Or (Requête3.new_value)="90" ) AND ((Requête3.old_value)<>"80" And (Requête3.old_value)<>"90" ))
  4. GROUP BY Requête3.bug_id;


 
Le problème c'est que là entre 10/1/2005 et 19/01/2005  
 
si ya ça dans la table :
 
bug_id----date_modified------------- old_value--------- new_value
12--------13/01/2005 19:26:28------ 10----------------80
12--------18/01/2005 17:38:15------80----------------45
12--------18/01/2005 17:39:37------ 45----------------90
12--------18/01/2005 17:39:59------ 90----------------80
12--------18/01/2005 17:50:28------ 80----------------90
 
il me donne bien la date 18/01/2005 17:39:37 qui correspond au premier 80 ou 90
par contre si j'ai ça:
 
bug_id----date_modified------------- old_value--------- new_value
 
12--------13/01/2005 19:26:28------ 10----------------80
12--------18/01/2005 17:38:15------80----------------45
12--------18/01/2005 17:39:37------ 45----------------90
12--------18/01/2005 17:39:59------ 90----------------10
12--------18/01/2005 17:50:28------ 10----------------40
 
il va quand meme me renvoyer 18/01/2005 17:39:37 alors que moi je veux qu'il ne me renvoi rien, je ne veux pas qu'il me compte le bug car il finit par un 40
 
 
 

Reply

Marsh Posté le 02-03-2006 à 09:44:54    

Essaye quelquechose comme ça :
 

Code :
  1. DROP TABLE requete3;
  2. CREATE TABLE requete3
  3. (bug NUMBER(9),
  4. date_modified DATE,
  5. old_value NUMBER(9),
  6. new_value NUMBER(9));
  7. INSERT INTO requete3 VALUES (140, TO_DATE('01/02/2005 14:36:54', 'DD/MM/YYYY HH24:MI:SS'), 10, 15);
  8. INSERT INTO requete3 VALUES (140, TO_DATE('02/02/2005 09:50:16', 'DD/MM/YYYY HH24:MI:SS'), 15, 20);
  9. INSERT INTO requete3 VALUES (140, TO_DATE('02/02/2005 12:07:36', 'DD/MM/YYYY HH24:MI:SS'), 20, 30);
  10. INSERT INTO requete3 VALUES (140, TO_DATE('02/02/2005 17:44:15', 'DD/MM/YYYY HH24:MI:SS'), 30, 20);
  11. INSERT INTO requete3 VALUES (140, TO_DATE('03/02/2005 13:43:23', 'DD/MM/YYYY HH24:MI:SS'), 20, 30);
  12. INSERT INTO requete3 VALUES (140, TO_DATE('22/02/2005 11:09:37', 'DD/MM/YYYY HH24:MI:SS'), 40, 45);
  13. INSERT INTO requete3 VALUES (140, TO_DATE('24/02/2005 18:33:05', 'DD/MM/YYYY HH24:MI:SS'), 45, 80);
  14. INSERT INTO requete3 VALUES (140, TO_DATE('04/03/2005 12:23:50', 'DD/MM/YYYY HH24:MI:SS'), 80, 90);
  15. INSERT INTO requete3 VALUES (140, TO_DATE('29/03/2005 15:05:40', 'DD/MM/YYYY HH24:MI:SS'), 90, 20);
  16. INSERT INTO requete3 VALUES (140, TO_DATE('29/03/2005 15:05:50', 'DD/MM/YYYY HH24:MI:SS'), 20, 15);
  17. INSERT INTO requete3 VALUES (140, TO_DATE('29/03/2005 15:11:25', 'DD/MM/YYYY HH24:MI:SS'), 15, 20);
  18. INSERT INTO requete3 VALUES (140, TO_DATE('09/06/2005 16:42:45', 'DD/MM/YYYY HH24:MI:SS'), 20, 30);
  19. INSERT INTO requete3 VALUES (140, TO_DATE('15/06/2005 11:39:25', 'DD/MM/YYYY HH24:MI:SS'), 30, 20);
  20. INSERT INTO requete3 VALUES (140, TO_DATE('29/06/2005 11:18:17', 'DD/MM/YYYY HH24:MI:SS'), 20, 30);
  21. INSERT INTO requete3 VALUES (140, TO_DATE('29/07/2005 10:12:38', 'DD/MM/YYYY HH24:MI:SS'), 30, 45);
  22. INSERT INTO requete3 VALUES (140, TO_DATE('18/08/2005 18:29:47', 'DD/MM/YYYY HH24:MI:SS'), 45, 80);
  23. INSERT INTO requete3 VALUES (140, TO_DATE('10/10/2005 12:17:49', 'DD/MM/YYYY HH24:MI:SS'), 80, 45);
  24. INSERT INTO requete3 VALUES (140, TO_DATE('20/10/2005 11:24:58', 'DD/MM/YYYY HH24:MI:SS'), 45, 40);
  25. INSERT INTO requete3 VALUES (140, TO_DATE('20/10/2005 11:25:20', 'DD/MM/YYYY HH24:MI:SS'), 40, 45);
  26. INSERT INTO requete3 VALUES (140, TO_DATE('17/01/2006 16:44:08', 'DD/MM/YYYY HH24:MI:SS'), 45, 80);
  27. INSERT INTO requete3 VALUES (140, TO_DATE('06/02/2006 10:15:46', 'DD/MM/YYYY HH24:MI:SS'), 80, 90);
  28. SELECT * FROM requete3;
  29. SELECT MIN(date_modified) FROM requete3
  30. WHERE date_modified >= TO_DATE('22/02/2005 11:09:37', 'DD/MM/YYYY HH24:MI:SS')
  31. AND date_modified <= TO_DATE('29/03/2005 15:05:40', 'DD/MM/YYYY HH24:MI:SS')
  32. AND EXISTS
  33. (SELECT 1
  34. FROM requete3
  35. WHERE date_modified =
  36. (SELECT MAX(date_modified)
  37.   FROM requete3
  38.   WHERE date_modified >= TO_DATE('22/02/2005 11:09:37', 'DD/MM/YYYY HH24:MI:SS')
  39.   AND date_modified <= TO_DATE('29/03/2005 15:05:40', 'DD/MM/YYYY HH24:MI:SS'))
  40. AND new_value IN (80, 90))
  41. AND new_value IN (80, 90);
  42. => aucune ligne
  43. SELECT MIN(date_modified) FROM requete3
  44. WHERE date_modified >= TO_DATE('29/07/2005 10:12:38', 'DD/MM/YYYY HH24:MI:SS')
  45. AND date_modified <= TO_DATE('06/02/2006 10:15:46', 'DD/MM/YYYY HH24:MI:SS')
  46. AND EXISTS
  47. (SELECT 1
  48. FROM requete3
  49. WHERE date_modified =
  50. (SELECT MAX(date_modified)
  51.   FROM requete3
  52.   WHERE date_modified >= TO_DATE('29/07/2005 10:12:38', 'DD/MM/YYYY HH24:MI:SS')
  53.   AND date_modified <= TO_DATE('06/02/2006 10:15:46', 'DD/MM/YYYY HH24:MI:SS'))
  54. AND new_value IN (80, 90))
  55. AND new_value IN (80, 90);
  56. => 18/08/2005 18:29:47


 
edit : exemple sous Oracle, à adapter pour un autre SGBD.

Message cité 1 fois
Message édité par Beegee le 02-03-2006 à 09:46:00
Reply

Marsh Posté le 02-03-2006 à 09:54:02    

Beegee a écrit :

Essaye quelquechose comme ça :
 

Code :
  1. SELECT MIN(date_modified) FROM requete3
  2. WHERE date_modified >= TO_DATE('29/07/2005 10:12:38', 'DD/MM/YYYY HH24:MI:SS')
  3. AND date_modified <= TO_DATE('06/02/2006 10:15:46', 'DD/MM/YYYY HH24:MI:SS')
  4. AND EXISTS
  5. (SELECT 1
  6. FROM requete3
  7. WHERE date_modified =
  8. (SELECT MAX(date_modified)
  9.   FROM requete3
  10.   WHERE date_modified >= TO_DATE('29/07/2005 10:12:38', 'DD/MM/YYYY HH24:MI:SS')
  11.   AND date_modified <= TO_DATE('06/02/2006 10:15:46', 'DD/MM/YYYY HH24:MI:SS'))
  12. AND new_value IN (80, 90))
  13. AND new_value IN (80, 90);
  14. => 18/08/2005 18:29:47


 
edit : exemple sous Oracle, à adapter pour un autre SGBD.


 
c'est très bien pour le premier exemple mais pas pour le deuxième malheureusement.  
En fait il faut que entre le 29/07/2005 et le 06/02/2006 je récupère '17/01/2006 16:44:08' et non 18/08/2005 18:29:47
 
 

Code :
  1. INSERT INTO requete3 VALUES (140, TO_DATE('29/07/2005 10:12:38', 'DD/MM/YYYY HH24:MI:SS'), 30,45);
  2. INSERT INTO requete3 VALUES (140, TO_DATE('18/08/2005 18:29:47', 'DD/MM/YYYY HH24:MI:SS'), 45, 80);
  3. INSERT INTO requete3 VALUES (140, TO_DATE('10/10/2005 12:17:49', 'DD/MM/YYYY HH24:MI:SS'), 80, 45);
  4. INSERT INTO requete3 VALUES (140, TO_DATE('20/10/2005 11:24:58', 'DD/MM/YYYY HH24:MI:SS'), 45, 40);
  5. INSERT INTO requete3 VALUES (140, TO_DATE('20/10/2005 11:25:20', 'DD/MM/YYYY HH24:MI:SS'), 40, 45);
  6. INSERT INTO requete3 VALUES (140, TO_DATE('17/01/2006 16:44:08', 'DD/MM/YYYY HH24:MI:SS'), 45, 80);
  7. INSERT INTO requete3 VALUES (140, TO_DATE('06/02/2006 10:15:46', 'DD/MM/YYYY HH24:MI:SS'), 80, 90);


 
il ne faut pas que je récupère le premier 80 mais le premier avant le dernier
 
80
40
50
80
90
 
je récupère le 4ème
 
80
40
80
90
80
 
je récupère le 3ème
 
80
50
90
 
je récupère le dernier.
 

Reply

Marsh Posté le 02-03-2006 à 10:36:36    

l'avant-dernier s'il y en a 2 consécutifs en fin de chaine, sinon le dernier ... je vais regarder.

Reply

Marsh Posté le 02-03-2006 à 10:37:25    

ou l'avant avant dernier si yen a 3 consécutifs, etc ...
c'est compliqué :-(

Reply

Marsh Posté le 02-03-2006 à 11:44:41    

ah ok, la première date_modified pour les new_value consecutives et contenant 80 ou 90 ...
 
donc il faut exclure les résultat tels qu'il existe une ligne à une date supérieure avec un new_value étant ni 80 ni 90.
 
Essaye ça pour voir :
 

Code :
  1. SELECT MIN(date_modified) FROM requete3 r3
  2. WHERE date_modified >= TO_DATE('22/02/2005 11:09:37', 'DD/MM/YYYY HH24:MI:SS')
  3. AND date_modified <= TO_DATE('06/02/2006 10:15:46', 'DD/MM/YYYY HH24:MI:SS')
  4. AND EXISTS
  5. (SELECT 1
  6. FROM requete3
  7. WHERE date_modified =
  8. (SELECT MAX(date_modified)
  9.   FROM requete3
  10.   WHERE date_modified >= TO_DATE('22/02/2005 11:09:37', 'DD/MM/YYYY HH24:MI:SS')
  11.   AND date_modified <= TO_DATE('06/02/2006 10:15:46', 'DD/MM/YYYY HH24:MI:SS'))
  12. AND new_value IN (80, 90))
  13. AND new_value IN (80, 90)
  14. AND NOT EXISTS
  15. (SELECT 1
  16. FROM requete3
  17. WHERE date_modified > r3.date_modified
  18. AND new_value NOT IN (80, 90));


Message édité par Beegee le 02-03-2006 à 11:48:17
Reply

Marsh Posté le 02-03-2006 à 11:51:35    

oui voilà si ya cette suite là par exemple:
 
20 => 01/02/2005
40 => 02/02/2005
80 => 03/02/2005
90 => 04/02/2005
30 => 05/02/2005
60 => 06/02/2005
80 => 07/02/2005
90 => 08/02/2005
80 => 09/02/2005
90 => 10/02/2005
 
si c'est sur 01/2005 alors il faut que je récupère 80 => 07/02/2005
si c'est du 01 au 05/02/2005 il faut que je ne récupère rien car ça se finit pas par 80 ou 90
si c'est du 01 au 04/02/2005 et bien je récupère 80 => 03/02/2005
si c'est du 01 au 03/02/2005 et bien je récupère 80 => 03/02/2005
 
c'est difficile à expliquer ...

Reply

Marsh Posté le 02-03-2006 à 11:52:24    

isa21493 a écrit :


 
si c'est sur 01/2005 alors il faut que je récupère 80 => 07/02/2005
 


 
oups sur 02/2005 pardon

Reply

Marsh Posté le 02-03-2006 à 11:52:24   

Reply

Marsh Posté le 02-03-2006 à 12:35:26    

tu as essayé la nouvelle requête que je t'ai donnée plus haut ? :)

Reply

Marsh Posté le 02-03-2006 à 12:44:03    

sous access la requete donne ça:
 

Code :
  1. SELECT Min(date_modified) AS Expr1
  2. FROM Requête3 AS r3
  3. WHERE (((r3.date_modified) Between #2/22/2005# And #2/6/2006#) AND ((Exists (SELECT 1
  4. FROM Requête3
  5. WHERE date_modified =
  6. (SELECT MAX(date_modified)
  7.   FROM Requête3
  8.   WHERE date_modified >= ('22/02/2005')
  9.   AND date_modified <= ('06/02/2006'))
  10. AND new_value IN (80, 90)))<>False) AND ((r3.new_value) In (80,90)) AND ((Exists (SELECT 1
  11. FROM Requête3
  12. WHERE date_modified > r3.date_modified
  13. AND new_value NOT IN (80, 90)))=False));


 
mais j'ai une erreur:
"Type de données incompatibles dans l'expression du critère"

Reply

Marsh Posté le 02-03-2006 à 12:45:34    

Code :
  1. SELECT Min(date_modified) AS Expr1
  2. FROM Requête3 AS r3
  3. WHERE (((r3.date_modified) Between #2/22/2005# And #2/6/2006#) AND ((Exists (SELECT 1
  4. FROM Requête3
  5. WHERE date_modified =
  6. (SELECT MAX(date_modified)
  7.   FROM Requête3
  8.   WHERE ((r3.date_modified) Between #2/22/2005# And #2/6/2006#))
  9. AND new_value IN (80, 90)))<>False) AND ((r3.new_value) In (80,90)) AND ((Exists (SELECT 1
  10. FROM Requête3
  11. WHERE date_modified > r3.date_modified
  12. AND new_value NOT IN (80, 90)))=False));

Reply

Marsh Posté le 02-03-2006 à 12:48:13    

tu dois avoir un problème dans la réécriture pour Access, sour Oracle ma requête marche.

Reply

Marsh Posté le 02-03-2006 à 12:52:16    

ok ben je regarde
merci en tout cas

Reply

Marsh Posté le 02-03-2006 à 13:16:37    

en fait ma requete 3 est pas une table mais une requete.
donc j'ai essayé de l'intégrer dans ta formule mais ça ne marche pas,
il dit qu'il ne trouve pas la table (select ...
 

Code :
  1. SELECT MIN(date_modified) FROM (SELECT table_bug_history_table.bug_id, table_bug_history_table.date_modified, table_bug_history_table.old_value, table_bug_history_table.new_value
  2. FROM table_custom_field_string_table INNER JOIN table_bug_history_table ON table_custom_field_string_table.bug_id=table_bug_history_table.bug_id
  3. WHERE (((table_custom_field_string_table.field_id)=1))
  4. GROUP BY table_bug_history_table.bug_id, table_bug_history_table.date_modified, table_bug_history_table.field_name, table_bug_history_table.old_value, table_bug_history_table.new_value
  5. HAVING (((table_bug_history_table.field_name)='status'))
  6. ORDER BY table_bug_history_table.bug_id, table_bug_history_table.date_modified) r3
  7. WHERE date_modified >= TO_DATE('22/02/2005 11:09:37', 'DD/MM/YYYY HH24:MI:SS')
  8. AND date_modified <= TO_DATE('06/02/2006 10:15:46', 'DD/MM/YYYY HH24:MI:SS')
  9. AND EXISTS
  10. (SELECT 1
  11. FROM (SELECT table_bug_history_table.bug_id, table_bug_history_table.date_modified, table_bug_history_table.old_value, table_bug_history_table.new_value
  12. FROM table_custom_field_string_table INNER JOIN table_bug_history_table ON table_custom_field_string_table.bug_id=table_bug_history_table.bug_id
  13. WHERE (((table_custom_field_string_table.field_id)=1))
  14. GROUP BY table_bug_history_table.bug_id, table_bug_history_table.date_modified, table_bug_history_table.field_name, table_bug_history_table.old_value, table_bug_history_table.new_value
  15. HAVING (((table_bug_history_table.field_name)='status'))
  16. ORDER BY table_bug_history_table.bug_id, table_bug_history_table.date_modified) tab
  17. WHERE date_modified =
  18. (SELECT MAX(date_modified)
  19.   FROM (SELECT table_bug_history_table.bug_id, table_bug_history_table.date_modified, table_bug_history_table.old_value, table_bug_history_table.new_value
  20. FROM table_custom_field_string_table INNER JOIN table_bug_history_table ON table_custom_field_string_table.bug_id=table_bug_history_table.bug_id
  21. WHERE (((table_custom_field_string_table.field_id)=1))
  22. GROUP BY table_bug_history_table.bug_id, table_bug_history_table.date_modified, table_bug_history_table.field_name, table_bug_history_table.old_value, table_bug_history_table.new_value
  23. HAVING (((table_bug_history_table.field_name)='status'))
  24. ORDER BY table_bug_history_table.bug_id, table_bug_history_table.date_modified) tab2
  25.   WHERE date_modified >= TO_DATE('22/02/2005 11:09:37', 'DD/MM/YYYY HH24:MI:SS')
  26.   AND date_modified <= TO_DATE('06/02/2006 10:15:46', 'DD/MM/YYYY HH24:MI:SS'))
  27. AND new_value IN (80, 90))
  28. AND new_value IN (80, 90)
  29. AND NOT EXISTS
  30. (SELECT 1
  31. FROM (SELECT table_bug_history_table.bug_id, table_bug_history_table.date_modified, table_bug_history_table.old_value, table_bug_history_table.new_value
  32. FROM table_custom_field_string_table INNER JOIN table_bug_history_table ON table_custom_field_string_table.bug_id=table_bug_history_table.bug_id
  33. WHERE (((table_custom_field_string_table.field_id)=1))
  34. GROUP BY table_bug_history_table.bug_id, table_bug_history_table.date_modified, table_bug_history_table.field_name, table_bug_history_table.old_value, table_bug_history_table.new_value
  35. HAVING (((table_bug_history_table.field_name)='status'))
  36. ORDER BY table_bug_history_table.bug_id, table_bug_history_table.date_modified) tab3
  37. WHERE date_modified > r3.date_modified
  38. AND new_value NOT IN (80, 90));


Reply

Marsh Posté le 03-03-2006 à 15:38:07    

j'arrive vraiment pas à transformer la requete de oracle à access

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed