IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Recherche de dates voisines


Sujet :

Langage SQL

  1. #1
    Membre actif
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Points : 210
    Points
    210
    Par défaut Recherche de dates voisines
    Bonjour tout le monde, j'ai une requête à bâtir qui doit retourner seulement les enregistrements d'une table qui ont un enregistrement dit "voisin" I.E. La date d'insertion de l'enregistrement se trouve à moins de 30 jours d'un autre. Voici un exemple avec une table simplifiée (excusez l'alignement des éléments):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Client | DateReclamation | Montant
    001   |      2010-03-01   | 100$
    002   |      2010-05-09   | 300$
    003   |      2010-05-17   | 250$
    Je dois donc faire une requête qui ne me retourne que les enregistrements 002 et 003, puisqu'ils sont mutuellement voisins de moins de 30 jours, contrairement au 001 qui est tout seul dans son coin.

    Est-ce quelqu'un a une idée de comment procéder? On dirait qu'il faudrait que je sois capable de voir deux enregistrements en même temps dans la requête, chose qui est un peu hors du commun pour moi.

    Merci d'avance,

    Osu

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 285
    Points : 11 740
    Points
    11 740
    Par défaut
    Il peut y avoir des choses plus simples ou optimales selon ton SGBD, mais en standard, tu peux utiliser un EXISTS :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Select *
    From ta_table T1
    WHERE EXISTS (
      SELECT 1
      FROM ta_table T2 
      WHERE T1.DateReclamation < T2.DateReclamation
    )
    Peut-il y avoir plus de deux "voisins" ?

  3. #3
    Membre actif
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Points : 210
    Points
    210
    Par défaut
    Je ne savais pas qu'on pouvait faire un truc dans le genre en SQL . Mais effectivement, il n'y a pas de limites au nombre de voisins qu'un enregistrement peut avoir. C'est justement ceux là qu'on recherche pour voir qui réclame le plus. Et pour ce qui est du SGBD c'est du MySQL bien ordinaire. Est-ce qu'on peut également spécifier un intervalle de 30 jours au lieu de simplement donner Date1 < Date2? Et si oui, comment?

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 285
    Points : 11 740
    Points
    11 740
    Par défaut
    Désolé, j'ai oublié l'histoire des 30 jours ... j'en profite pour revoir un peu le truc qui n'était pas ben calé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT T1.*
    FROM ta_table T1
    WHERE EXISTS (
      SELECT 1
      FROM ta_table T2 
      WHERE DATEDIFF(T1.DateReclamation, T2.DateReclamation) BETWEEN -30 AND 30
        AND T1.DateReclamation <> T2.DateReclamation
    )

    NB : message et requête modifiés à 13:35

  5. #5
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 285
    Points : 11 740
    Points
    11 740
    Par défaut
    Citation Envoyé par osuwariboy Voir le message
    Je ne savais pas qu'on pouvait faire un truc dans le genre en SQL . Mais effectivement, il n'y a pas de limites au nombre de voisins qu'un enregistrement peut avoir.
    Imaginons que j'aie des réclamations aux dates suivantes :
    1. 1er mai
    2. 20 mai
    3. 5 juin.


    A est voisin avec B mais pas avec C, C est voisin avec mais pas avec A, et B est voisin avec les deux autres. Comment représenterais-tu cela ?

  6. #6
    Membre actif
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Points : 210
    Points
    210
    Par défaut
    C'est cool Antoun, je vais essayer ça

    Citation Envoyé par Antoun Voir le message
    Imaginons que j'aie des réclamations aux dates suivantes :
    ...

    A est voisin avec B mais pas avec C, C est voisin avec mais pas avec A, et B est voisin avec les deux autres. Comment représenterais-tu cela ?
    Dans ce cas-ci, il faudrait que je ramène les trois enregistrements puisqu'ils ont tous un voisin. Idéalement j'aimerais que ma requête ne me les ramènent qu'une seule fois (ma vrai table compte 1.5 millions d'enregistrements alors ça peut monter vite).

  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 285
    Points : 11 740
    Points
    11 740
    Par défaut
    Citation Envoyé par osuwariboy Voir le message
    Dans ce cas-ci, il faudrait que je ramène les trois enregistrements puisqu'ils ont tous un voisin. Idéalement j'aimerais que ma requête ne me les ramènent qu'une seule fois (ma vrai table compte 1.5 millions d'enregistrements alors ça peut monter vite).
    OK, dans ce cas le EXISTS est sans doute le plus adapté... j'ai modifié ma requête ci-dessus pour mieux coller à ce que tu veux faire.

  8. #8
    Membre actif
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Points : 210
    Points
    210
    Par défaut
    Merci Antoun, ça a marché

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. <= (plus petit égal) + recherche de date
    Par Bindy dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/07/2006, 11h15
  2. [débutant] recherche sur dates en VBA
    Par tojiji dans le forum Access
    Réponses: 4
    Dernier message: 10/07/2006, 12h51
  3. [VBA-E]Recherche de date dans plusieurs feuilles
    Par atypik dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 05/04/2006, 21h36
  4. [VB6] Recherche de dates
    Par tim69000 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 22/03/2006, 16h40
  5. Moteur de recherche par date
    Par Prue dans le forum ASP
    Réponses: 17
    Dernier message: 27/08/2003, 17h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo