[SQL] Sélectionner l'avant dernière date
harry_le_ravi
-
Airmanbzh Messages postés 119 Date d'inscription Statut Membre Dernière intervention -
Airmanbzh Messages postés 119 Date d'inscription Statut Membre Dernière intervention -
Bonjour à tous,
Je suis à la recherche de 2 requetes SQL me permettant de relever :
- la valeur d'un champ a où le champ date est supérieur à toutes les autres
[CODE]Select table.a FROM table WHERE table.date > ALL[/CODE]
- la valeur d'un champ a où le champ date correspond à l'avant dernière date (celle juste avant la précédente requête)
Pourriez vous me dire si la première requête est correcte et la solution de la deuxième.
Merci d'avance.
Je suis à la recherche de 2 requetes SQL me permettant de relever :
- la valeur d'un champ a où le champ date est supérieur à toutes les autres
[CODE]Select table.a FROM table WHERE table.date > ALL[/CODE]
- la valeur d'un champ a où le champ date correspond à l'avant dernière date (celle juste avant la précédente requête)
Pourriez vous me dire si la première requête est correcte et la solution de la deuxième.
Merci d'avance.
A voir également:
- Sql dernière date
- Dernière version ccleaner gratuit français - Télécharger - Nettoyage
- Supprimer dernière page word - Guide
- Dernière version chrome - Accueil - Applications & Logiciels
- Mode avion whatsapp dernière connexion - Guide
- Airpods 3 date de sortie - Guide
9 réponses
Ah oui!
Je n'avais pas étudié le LIMIT.
Ca me semble pas mal du tout.
Je selectionne les valeurs du champ a par ordre de date decroissant et j'affiche que les deux premiers résultats.
Par contre au niveau optimisation ca risque de bouffer pas mal de ressource si je dois séléctionner au préalable toutes les valeurs a de la table?
Je titille un peu quand même c'est juste par curiosité.
Merci.
Je n'avais pas étudié le LIMIT.
Ca me semble pas mal du tout.
Je selectionne les valeurs du champ a par ordre de date decroissant et j'affiche que les deux premiers résultats.
Par contre au niveau optimisation ca risque de bouffer pas mal de ressource si je dois séléctionner au préalable toutes les valeurs a de la table?
Je titille un peu quand même c'est juste par curiosité.
Merci.
On me propose ceci pour la première requête:
SELECT TABLE.a
FROM TABLE
WHERE TABLE.date = (SELECT max(TABLE.date) FROM TABLE);
Pour la deuxième on me propose ceci:
SELECT TABLE.a
FROM TABLE
WHERE TABLE.date = (SELECT max(TABLE.date) FROM TABLE WHERE date < (SELECT max(date) FROM TABLE));
SELECT TABLE.a
FROM TABLE
WHERE TABLE.date = (SELECT max(TABLE.date) FROM TABLE);
Pour la deuxième on me propose ceci:
SELECT TABLE.a
FROM TABLE
WHERE TABLE.date = (SELECT max(TABLE.date) FROM TABLE WHERE date < (SELECT max(date) FROM TABLE));
Oui, effectivement, je n'avais pas fait attention que c'était un autre champ que le champ date que tu voulais récupérer.
La première m'a l'air correcte. Essaye de tester sans le second select (pour des raisons d'optimisation)
Je ne sais pas si ça marche ou pas de cette façon mais ça vaut le coup d'essayer ;-)
Pour la seconde, il risque d'y avoir une erreure parce que ta requête imbriquée retourne plusieurs résultats
Par contre je viens de penser à quelque chose :
Une requête d'une seule ligne te retourne 2 lignes. La première avec le champ a correspondant à la plus grande date et une seconde avec le champ a correspondant à la date suivante (donc l'avant dernière).
Plus optimisé et moins tordu que toutes celles qu'on a pu proposer ;-).
Et si tu veux 2 requêtes obligatoirement tu peux faire :
La première m'a l'air correcte. Essaye de tester sans le second select (pour des raisons d'optimisation)
SELECT TABLE.a FROM TABLE WHERE TABLE.date = max(TABLE.date);
Je ne sais pas si ça marche ou pas de cette façon mais ça vaut le coup d'essayer ;-)
Pour la seconde, il risque d'y avoir une erreure parce que ta requête imbriquée retourne plusieurs résultats
SELECT TABLE.a FROM TABLE WHERE TABLE.date = (SELECT max(TABLE.date) FROM TABLE WHERE date < (SELECT max(date) FROM TABLE));
Par contre je viens de penser à quelque chose :
SELECT table.a FROM table ORDER BY table.date DESC LIMIT 0,2;
Une requête d'une seule ligne te retourne 2 lignes. La première avec le champ a correspondant à la plus grande date et une seconde avec le champ a correspondant à la date suivante (donc l'avant dernière).
Plus optimisé et moins tordu que toutes celles qu'on a pu proposer ;-).
Et si tu veux 2 requêtes obligatoirement tu peux faire :
// plus grande date SELECT table.a FROM table ORDER BY table.date DESC LIMIT 0,1; //Avant derniere date SELECT table.a FROM table ORDER BY table.date DESC LIMIT 1,1;
En fait, mysql va récupérer tous les lignes de ta table et les trier donc ce sera un algo de complexité "2n" vu l'algorithme de traitement de mysql.
Donc il vaut mieux faire ça que, faire 2 selects dans une même requêtes avec un filtre sur les données.
Pour 5000lignes de données :
Avec ... LIMIT ... : 2n
Requêtes imbriquées : n^2+5000*(le nombre de filtres)
C'est donc un gain de temps et de calculs processeurs.
Donc il vaut mieux faire ça que, faire 2 selects dans une même requêtes avec un filtre sur les données.
Pour 5000lignes de données :
Avec ... LIMIT ... : 2n
Requêtes imbriquées : n^2+5000*(le nombre de filtres)
C'est donc un gain de temps et de calculs processeurs.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
bonjour
tu px utilisé deux query
dans le 1er tu prend que les deux premier enregistrement en triant par date croissant
et dans le 2eme tu prend le max date du 1ere query.
ou tu px je pense faire la manipe avec un seul query et tu applique la même chose.
tu px utilisé deux query
dans le 1er tu prend que les deux premier enregistrement en triant par date croissant
et dans le 2eme tu prend le max date du 1ere query.
ou tu px je pense faire la manipe avec un seul query et tu applique la même chose.
et ben je suis dsl j ai pas sql sur mon pc mais je vais l installé ce soir si tu vx je px te donner le code transact
Pour la version SQL, j'aurais fait quelques chose comme ça :
Et je pense que tu peux récupérer ton avant dernière date en utilisant une fonction du type :
Explications : tu recupère la date possédant le minimum de jour entre la date maximum et une date Y. La condition te permet de filtrer que la date retournée ne soit pas la date maximum.
J'espère que ça solutionnera ton problème.
Cdt
SELECT MAX(table.date) FROM table
Et je pense que tu peux récupérer ton avant dernière date en utilisant une fonction du type :
SELECT MIN(MAX(table.date) - table.date) FROM table WHERE TO_DAYS(MAX(table.date) - table.date) >0;
Explications : tu recupère la date possédant le minimum de jour entre la date maximum et une date Y. La condition te permet de filtrer que la date retournée ne soit pas la date maximum.
J'espère que ça solutionnera ton problème.
Cdt