Optimisation de requête imbriquée - SQL/NoSQL - Programmation
Marsh Posté le 17-11-2009 à 13:23:06
Salut,
select valeur
from event
where tag = '%1'
and DateEvent < '%2'
group by tag
having DateEvent = max(DateEvent)
C'est la clause HAVING qui te permet de n'obtenir que la ligne voulue.
Marsh Posté le 17-11-2009 à 14:00:57
Merci Fred 999 pour ta réponse, mais je pense que l'idéal c'est de recuperer une liste avec tous les TAGS sinon je dois faire autant de requete qu'il y a de tags (et y'en a un certain nombre)....
Le group by est bien la solution que j'ai implémentée ainsi
SELECT EDB.tagname,EDB.valuestring,EDB. DateEvent
FROM event as EDB,
Select Max(DateEvent) as MaxDate, tag
FROM eventdbww WHERE DateEvent < '%2' GROUP BY tag HAVING tag IN (%1) ) maxresults
WHERE EDB.tag=maxresults.tag AND EDB.DateEvent =maxresults.MaxDate
Pour ton exemple , je crois que tu ne peux utiliser dans le having qu'une clause se reportant au champs mentionné dans le GROUP BY (En fait chez moi ca fait une erreur ton code.
Marsh Posté le 17-11-2009 à 15:08:56
ah tu veux tous les tags d'un coup ?
select valeur, max(DateEvent)
from event
where DateEvent < '%2'
group by tag
having DateEvent = max(DateEvent)
si tu ne veux qu'une liste de tags, fais un tag in (liste), je pense que ce sera + rapide que ton select imbriqué
Marsh Posté le 17-11-2009 à 17:04:34
euh, faut pas le champ "tag" dans le select pour que la clause group by fonctionne
Marsh Posté le 17-11-2009 à 17:14:28
Chez moi ça marche comme ça (en transact-sql), j'avoue que c'est pas très joli comme code :c
Marsh Posté le 17-11-2009 à 10:35:01
Bonjour,
je suis loin d'être un expert en SQL. Je désire optimiser une requête pour que celle ci soit plus rapide:
Ma table "event" se compose ainsi:
Tag | Valeur | DateEvent
Elle est remplie d'enregistrement datés.
Je recherche le dernier enregistrement précédant une date précise pour une liste de variable (Tag) prédéfinie.
Pour l'instant j'exécute cette requête pour chaque Tag . Mais j'aimerai réduire son temps d'exécution
SELECT Valeur FROM event WHERE Tag ='%1' AND DateEvent = (Select Max(DateEvent ) FROM event Where Tag ='%1' AND DateEvent < '%2' )
%1 est le nom d'un Tag
%2 est la Date limite
Je pense que le plus rapide serait de réaliser une seule requête qui sortirait une table Tag, Valeur mais je ne vois pas bien comment réaliser cela. C'est pourquoi je demand votre aide sur ce point
Je travaille sur une Base SQL server via ODBC
Merci d'avance
g,
EDIT: Un début de réponse ici: je creuse Bon j'ai un début de piste ici:
http://www.techonthenet.com/sql/max.php
Message édité par Profil supprimé le 17-11-2009 à 11:23:06