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

SQL Oracle Discussion :

Obtenir la dernière valeur d'un champs pour des périodes


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 214
    Points : 100
    Points
    100
    Par défaut Obtenir la dernière valeur d'un champs pour des périodes
    Bonjour à tous.

    Le query que je dois réussir à faire est théoriquement simple à comprendre mais je pense assez difficile à créer.

    J'ai la table suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE "TEST_TABLE"
    (
    	"TID"           NUMBER(8),
    	"TIMESTAMP"     DATE,
    	"AVAILABILTY"   VARCHAR2(1) NOT NULL
    );
    Avec les données suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Insert into TEST_TABLE (TID,TIMESTAMP,AVAILABILTY) values ( 1 ,TO_DATE('29/08/2011 10:01','DD/MM/YYYY HH24:MI'), 'Y');
    Insert into TEST_TABLE (TID,TIMESTAMP,AVAILABILTY) values ( 1 ,TO_DATE('29/08/2011 10:02','DD/MM/YYYY HH24:MI'), 'N');
    Insert into TEST_TABLE (TID,TIMESTAMP,AVAILABILTY) values ( 1 ,TO_DATE('29/08/2011 10:04','DD/MM/YYYY HH24:MI'), 'Y');
    Insert into TEST_TABLE (TID,TIMESTAMP,AVAILABILTY) values ( 1 ,TO_DATE('29/08/2011 10:06','DD/MM/YYYY HH24:MI'), 'N');
    Insert into TEST_TABLE (TID,TIMESTAMP,AVAILABILTY) values ( 1 ,TO_DATE('29/08/2011 10:07','DD/MM/YYYY HH24:MI'), 'Y');
    Insert into TEST_TABLE (TID,TIMESTAMP,AVAILABILTY) values ( 1 ,TO_DATE('29/08/2011 10:08','DD/MM/YYYY HH24:MI'), 'N');
     
    Insert into TEST_TABLE (TID,TIMESTAMP,AVAILABILTY) values ( 2 ,TO_DATE('29/08/2011 10:01','DD/MM/YYYY HH24:MI'), 'N');
    Insert into TEST_TABLE (TID,TIMESTAMP,AVAILABILTY) values ( 2 ,TO_DATE('29/08/2011 10:02','DD/MM/YYYY HH24:MI'), 'Y');
    Insert into TEST_TABLE (TID,TIMESTAMP,AVAILABILTY) values ( 2 ,TO_DATE('29/08/2011 10:04','DD/MM/YYYY HH24:MI'), 'N');
    Insert into TEST_TABLE (TID,TIMESTAMP,AVAILABILTY) values ( 2 ,TO_DATE('29/08/2011 10:06','DD/MM/YYYY HH24:MI'), 'Y');
    Insert into TEST_TABLE (TID,TIMESTAMP,AVAILABILTY) values ( 2 ,TO_DATE('29/08/2011 10:07','DD/MM/YYYY HH24:MI'), 'N');
    Insert into TEST_TABLE (TID,TIMESTAMP,AVAILABILTY) values ( 2 ,TO_DATE('29/08/2011 10:09','DD/MM/YYYY HH24:MI'), 'Y');
    Mon but est de connaitre pour chaque TID différent la dernière valeur d'AVAILABILITY par tranche de 5 min.

    Bref dans l'exemple ci-dessus, la réponse devrait donner pour le TID 1:
    - de 10h00 à 10h05 => Y (venant du record de 10h04)
    - de 10h05 à 10h10 => N (venant du record de 10h08)
    Et pour le TID 2:
    - de 10h00 à 10h05 => N (venant du record de 10h04)
    - de 10h05 à 10h10 => Y (venant du record de 10h09)


    Alors je suis parvenu à faire le group by par 5 min via cette source mais pour la suite je sèche...

    Voici la query:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select 
    	ceil((TIMESTAMP-date '-4712-01-01')*288)/288+date '-4712-01-01',tid
    from TEST_TABLE
    group by 
      ceil((TIMESTAMP-date '-4712-01-01')*288)/288+date '-4712-01-01', tid;
    Seulement maintenant ce que je veux obtenir c'est l'AVAILABILITY de ce dernier record pour la période X et le TID Y.

    Pouvez-vous m'aider?

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 948
    Points : 5 847
    Points
    5 847
    Par défaut
    La réponse était également présente dans le lien.
    Regarde FIRST et LAST
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT tid,
           to_char(ceil((TIMESTAMP-date '-4712-01-01')*288)/288+date '-4712-01-01', 'DD/MM/YYYY HH24:MI:SS'),
           max(AVAILABILTY) keep (dense_rank last order by TIMESTAMP)
      FROM TEST_TABLE
     GROUP BY tid, ceil((TIMESTAMP-date '-4712-01-01')*288)/288+date '-4712-01-01';
     
           TID TO_CHAR(CEIL((TIMES M
    ---------- ------------------- -
             1 29/08/2011 10:05:00 Y
             1 29/08/2011 10:10:00 N
             2 29/08/2011 10:05:00 N
             2 29/08/2011 10:10:00 Y

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 214
    Points : 100
    Points
    100
    Par défaut
    En effet... honte sur moi

    Je te remercie pour m'avoir répondu.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 09/02/2009, 17h20
  2. [word vba] valeur d'un champ pour un caption
    Par greg778 dans le forum VBA Word
    Réponses: 2
    Dernier message: 16/06/2008, 09h25
  3. Tester la valeur d'un champ pour éviter options "has no properties"
    Par lodan dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 27/03/2007, 08h47
  4. [SQL] récuperer la derniére valeur d'un champ autoincrément
    Par belakhdarbts dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 26/06/2006, 13h37
  5. valeur d'un champ pour l'utiliser dans une requete
    Par bachilbouzouk dans le forum ASP
    Réponses: 4
    Dernier message: 08/04/2005, 16h58

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