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

SQLite Discussion :

une requete complexe.. enfin trop pour moi


Sujet :

SQLite

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Par défaut une requete complexe.. enfin trop pour moi
    Bonjour

    J'ai une table tb_cours avec un champ val03 et un champ date_time et un champ cross

    J'aimerais pouvoir executer la requete suivante :
    sélectionner date_time pour cross=eurusd ou val03=30 si val03 précédent pour le même cross<>30

    j'ai bien regardé du coté de Join mais de ce que j'ai compris il s'agit de sélections sur plusieurs tables donc je suis coincé...

    J'arrive à faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select date_time 
    where cross like 'eurusd' and val03=30 
    order by date_time asc
    mais pas à inclure ma deuxième condition

    Merci pour votre aide

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 138
    Par défaut
    Quand tu parles de "val03 précédent", c'est par rapport à quel critère ? un compteur, une date ?
    Si tu nous donnais un exemple, ce serait plus compréhensible : quelques lignes de la table, le résultat attendu...

    Il est tout à fait possible de faire des jointures sur la même table, à condition d'utiliser des alias.

    Je t'encourage à aller (re)lire le tutoriel de SQLPro sur les jointures, tu comprendras peut-être mieux comment tu peux faire.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Par défaut
    Merci d'avoir répondu. il était tard et je m étais tellement cassé la tête à trouver une solution que j ai écrit un peu à l 'arrache, fautes comprises.

    donc pour être plus précis voici un exemple de ma table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    id	date_time	        cross	val03	open	low	high	close
    2	10/08/2010 09:00	EURUSD	30	1.3177	1.3177	1.3177	1.3177
    30	10/08/2010 10:00	EURUSD	21	1.3159	1.3158	1.318	1.3168
    58	10/08/2010 11:00	EURUSD	30	1.3155	1.3146	1.3168	1.3158
    86	10/08/2010 12:00	EURUSD	30	1.3145	1.3144	1.3163	1.3154
    je souhaiterais donc pouvoir sélectionner la ligne id=58 parce qu' elle a une val03=30 et que le val03 de la ligne avec l id précédent (id=30) est <30 et ce en une seule requête.

    je travaille sous delphi donc ce que je fais en ce moment c est extraire une première liste de date_time avec les val03=30 puis une nouvelle liste avec les val_03 dont la date précede immédiatement celle de la liste.
    Si la valeur <30 alors je conserve cette date dans une nouvelle liste des dates définitives qui me servent à sélectionner les infos voulues.
    donc je fais 3 'passes' alors que si j avais les compétences en sql, je n en ferais qu une !


    merci pour l aide

    concernant le tuto, j ai regardé ça hier mais j'ai pas trouvé ce que je pouvais 'garder' pour travailler sur une seule table , j ai pas compris...

  4. #4
    Membre expérimenté

    Inscrit en
    Décembre 2004
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 169
    Par défaut
    Bonjour,

    Voici une solution et désolé pour l'attente.

    Soit le jeu de données suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    drop table if exists tb_cours;
    create table tb_cours (
        id	integer primary key
      , date_time text
      , CROSS text
      , val03 integer
      , open float
      , low float
      , high float
      , close float
    );
    begin ;
    insert into tb_cours values (2	,"10/08/2010 09:00",	"EURUSD",	30,	1.3177,	1.3177,	1.3177,	1.3177);
    insert into tb_cours values (30	,"10/08/2010 10:00",	"EURUSD",	21,	1.3159,	1.3158,	1.318,	1.3168);
    insert into tb_cours values (58	,"10/08/2010 11:00",	"EURUSD",	30,	1.3155,	1.3146,	1.3168,	1.3158);
    insert into tb_cours values (86	,"10/08/2010 12:00",	"EURUSD",	30,	1.3145,	1.3144,	1.3163,	1.3154);
    end;
    Je crée la vue suivante afin d'avoir pour toutes les lignes le id et le val03 de la ligne précédente. Je suppose que les id sont toujours croissants.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    drop view if exists vb_cours;
    create view vb_cours as
      select id, max(prev_id) as prev_id, date_time, val03, prev_val03, open, low, high, close
      from ( select  
        a.id 
      , b.id as prev_id
      , a.date_time
      , a.cross
      , a.val03
      , b.val03 as prev_val03
      , a.open
      , a.low
      , a.high
      , a.close
      from tb_cours a, tb_cours b
      ) where id > prev_id group by id;
    La réponse à ta question sera donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from vb_cours
    where val03=prev_id and prev_val03<id;
    Qui retourne la ligne 58 comme demandé.


    Je pense quand même que pour éviter la vue tu devrais utiliser un trigger qui à chaque insertion dans ta table, renseigne deux champs : prev_id et prev_val03. Ces deux valeurs étant trouvées à l'aide du max(rowid) where rowid<>new.rowid de la table.

    Si tu utilises la vue, alors il faudrait mettre un index sur val03. Mais il faut comprendre que si ta table fait 10.000 lignes alors ta vue traitera 10.000² lignes... C'est suffisamment gros pour mettre au tas ton code Delphi.

    Bonne continuation,
    ++

Discussions similaires

  1. Aide pour réaliser une requete complexe
    Par zaghi dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 11/10/2012, 12h51
  2. aide pour une requet complexe
    Par agnaou dans le forum Windows Forms
    Réponses: 2
    Dernier message: 06/07/2009, 23h10
  3. [MySQL] une requete complexe, enfin trop pour moi
    Par sp2308 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/06/2009, 23h06
  4. Requete un peu compliqué pour moi
    Par passie dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/04/2006, 16h08
  5. [SQL - ORACLE] Requete un peu compliquée (pour moi)
    Par Worldofdada dans le forum Langage SQL
    Réponses: 15
    Dernier message: 03/11/2005, 09h25

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