Obtenir toutes les données contenues entre deux dates

Bonjour,
Dans une base de données LO, je souhaite extraire les 10 dernières données enregistrée pour une clé précise. Pour se faire, je galère depuis un moment pour mettre au point la requête SQL.
Mon but est le suivant:
A partir de la table T_TiitreValeur, je veux extraire les dix derniers enregistrements.
J’ ai réussi à mettre au point la requête ci-dessous:

SELECT “T_TiitreValeur”.“Cf_ValeurTitre”, “T_TiitreValeur”.“Cf_Titre”, “T_Titre”.“Numero”, “T_TiitreValeur”.“Date”, “T_TiitreValeur”.“Valeur”, “T_TiitreValeur”.“Ecart”, “T_Titre”.“Cf_Titre”, “T_Titre”.“Cf_Consensus” FROM “T_TiitreValeur”, “T_Titre” WHERE “T_TiitreValeur”.“Cf_Titre” = “T_Titre”.“Cf_Titre” AND “T_Titre”.“Cf_Consensus” = 1 AND DATEDIFF( ‘dd’, “Date”, CURDATE( ) ) < 10 ORDER BY “T_Titre”.“Numero” ASC, “T_TiitreValeur”.“Date” ASC

Toutefois, je n’ arrive pas à remplacer la fonction CURDATE() par MAX(Date)
Je souhaite arriver à quelque chose comme cela:

WHERE Date BETWEEN MAX(DATE) AND MAX(Date)- 7

Je pense que cela est possible mais je n’ arrive pas à paramétrer correctement la condition WHERE.
Cordialement

Bonsoir @ElCatala

Pourquoi ne pas classer la table résultat selon le champ Date par ordre descendant et limiter la liste de résultat à 10 items par LIMIT comme ceci :

votre requête sauf la partie DATEDIFF()<10
ORDER BY Date DESC
LIMIT 10

Ajout suite à réponse

LIMIT 10 limite la liste de résultat à 10 items au maximum, quelque soit leur date. C’est ce que j’avais cru comprendre de votre demande

je souhaite extraire les 10 dernières données

Il n’existe pas de fonction MAXDATE. Pour obtenir la date la plus grande d’une série, il faut créer une table qui ne contient que l’agrégat MAX(“Date”). Pour cela :

LEFT OUTER JOIN (SELECT MAX("Date") AS "Maxdate" FROM "T_TiitreValeur") AS "TMaxdate"

Ensuite, vous pouvez créer une table de 20 titres dont des valeurs auront été enregistrées dans la période de 10 jours au plus avant “Maxdate” par un

LEFT OUTER JOIN (SELECT Titre FROM "T_TiitreValeur" where DATEDIFF( 'dd', "T_TiitreValeur"."Date", "TMaxdate"."Maxdate" ) < 10 LIMIT 20) AS "TDerniersTitresChanges"

Le problème de LIMIT est que son résultat est imprévisible : Vous en aurez 20 mais vous ne saurez pas prédire lesquels s’il se trouve que plus de 20 ont vu leurs valeurs modifiées durant les 10 derniers jours.

Enfin, vous pouvez utiliser la liste des titres de la table “TDernierTitresChanges” à la place de ceux de la table “T_Titre” : cela vous limitera les résultats des valeurs à celles des 20 titres concernées et en limitant “Date” aux 10 derniers jours, par DATEDIFF( ‘dd’, “T_TiitreValeur”.“Date”, “TMaxdate”.“Maxdate” ) < 10 vous limiterez à nous les valeurs concernées.

Cela pourra laisser des trous si tous les 20 titres concernés n’ont pas de valeurs pour chacun des 10 derniers jours et en particulier si une journée de cotation n’a pas été enregistrée. Mais vous avez les principes : diviser pour régner ! Créer “simplement” une table pour chaque contrainte et utiliser ces composants par la suite dans la requête principale.

Sans avoir la base sous la main, il est difficile de produire des indications plus précises. Mais je suis certain de votre proche succès. Dites-nous quand !


Pour montrer à la communauté que la question a trouvé sa réponse, cliquez sur ✓ à côté de la “bonne” réponse, et “votez” en cliquant sur la flèche ^ de toute réponse utile. Ce sont les mécanismes utilisés pour communiquer la qualité des questions et réponses sur ce site. Merci!

Pour tout complément d’information, utilisez les boutons situés en dessous de votre question et éditez votre question ou simplement ajouter un commentaire. SVP ! Ne répondez pas à votre propre question à moins d’y apporter une réelle réponse.

Cordialement, Michel

Bonjour @ElCatala

Je n’ai pas mis en avant l’écart entre le titre de votre question (toutes les dates entre 2 dates) et le début de sa description (les 10 dernières données) J’ai répondu à la description. Il serait bien de modifier soit le titre, soit la description pour préciser votre besoin.

Belle journée, Michel

Bonjour,
Merci de vos commentaires. J’ ai modifié le titre de la question. D’ autre part, après test de la fonction LIMIT, elle ne répond pas tout à fait à mon problème.
Dans le cas d’ un

ORDER BY Date DESC LIMIT 10,

Je n’ obtiens que les dix derniers enregistrements sur la dernière date des 10 premiers titres (au lieu de vingt).
Dans le cas d’ un

ORDER BY Numero Asc AND ORDER BY Date DESC LIMIT 10

J’ obtiens les dix derniers enregistrements d’ un seul Titre compris entre la date max et la date max - 10.
Ma recherche est de d’ obtenir tous les enregistrements correspondants au critère 1. Le résultat devrait donner :
20 titres correspondant au critère 1 avec pour chaque titre 10 dates.
Cordialement