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 Firebird Discussion :

Requete SQL ne se termine jamais


Sujet :

SQL Firebird

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 291
    Points : 144
    Points
    144
    Par défaut Requete SQL ne se termine jamais
    Bonjour,

    J'ai un problème avec la requete suivante :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    with T2 as (select 
    trim(REF_TURBINE_) as REF_TURBINE_,
    DATE_HEURE as DATE_HEURE,
    PUISS_ACTIVE_PRODUITE as PUISS_ACTIVE_PRODUITE,
    VITESSE_VENT_NACELLE as VITESSE_VENT_NACELLE from DATA_10MIN where NOM_PROJET='x'
    and DATE_HEURE between '05.05.2016 08:00:00' and '05.05.2016 10:00:00' and REF_TURBINE_='T5'),
    T3 as (select 
    trim(REF_TURBINE_) as REF_TURBINE__1,
    DATE_HEURE as DATE_HEURE_1,
    PUISS_ACTIVE_PRODUITE as PUISS_ACTIVE_PRODUITE_1,
    VITESSE_VENT_NACELLE as VITESSE_VENT_NACELLE_1 from DATA_10MIN where NOM_PROJET='x'
    and DATE_HEURE between '05.05.2016 08:00:00' and '05.05.2016 10:00:00' and REF_TURBINE_='T2'),
    T4 as (select 
    trim(REF_TURBINE_) as REF_TURBINE__2,
    DATE_HEURE as DATE_HEURE_2,
    PUISS_ACTIVE_PRODUITE as PUISS_ACTIVE_PRODUITE_2,
    VITESSE_VENT_NACELLE as VITESSE_VENT_NACELLE_2 from DATA_10MIN where NOM_PROJET='x'
    and DATE_HEURE between '05.05.2016 08:00:00' and '05.05.2016 10:00:00' and REF_TURBINE_='T4'),
    T5 as (select 
    trim(REF_TURBINE_) as REF_TURBINE__3,
    DATE_HEURE as DATE_HEURE_3,
    PUISS_ACTIVE_PRODUITE as PUISS_ACTIVE_PRODUITE_3,
    VITESSE_VENT_NACELLE as VITESSE_VENT_NACELLE_3 from DATA_10MIN where NOM_PROJET='x'
    and DATE_HEURE between '05.05.2016 08:00:00' and '05.05.2016 10:00:00' and REF_TURBINE_='T1') 
     
    select * from T2 full join T3 on T2.DATE_HEURE = T3.DATE_HEURE_1 full join T4 on T3.DATE_HEURE_1 = T4.DATE_HEURE_2 full join T5 on T4.DATE_HEURE_2 = T5.DATE_HEURE_3
    Voici le plan :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PLAN JOIN (T5 DATA_10MIN INDEX (I_DATA_10MIN_PRJT_DT_TRBN), JOIN (T4 DATA_10MIN INDEX (I_DATA_10MIN_PRJT_DT_TRBN), JOIN (T3 DATA_10MIN INDEX (I_DATA_10MIN_PRJT_DT_TRBN), T2 DATA_10MIN INDEX (I_DATA_10MIN_PRJT_DT_TRBN))))

    Lorsque la plage de date est de quelques heures ca fonctionne mais si je mets 1 jour elle ne se termine jamais. Comment pourrais je l'améliorer?

    Merci

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 126
    Points : 38 509
    Points
    38 509
    Billets dans le blog
    9
    Par défaut
    bonjour

    Quels sont les volumes à traiter et quelle est la description des index

    De plus,

    - formatez vos requêtes, c'est pénible de lire des requetes écrites à la volée
    - il eut été plus simple de nommer vos CTE en cohérence avec votre filtre sur REF_TURBINE : CTE T2=filtre T5, CTE T3=filtre T2 etc... c'est un peu tordu

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 291
    Points : 144
    Points
    144
    Par défaut
    Par jour la table DATA_10MIN contient environ 800 enregistrements.
    L'index est fait sur NOM_PROJET, DATE_HEURE, REF_TURBINE_

    Désolé pour la mise en forme

    Merci

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 126
    Points : 38 509
    Points
    38 509
    Billets dans le blog
    9
    Par défaut
    Pour la mise en forme des requetes il existe des outils gratuits, exemple : http://sqlformat.org/

    Vos colonnes date_heure sont bien de format timestamp, ce ne sont pas des char ou varchar ou autre format inapproprié ?

    Si oui, postez votre requete qui dure longtemps, et le DDL des tables et index
    Si non, corrigez ou faites corriger (dans la mesure du possible) vos colonnes pour utiliser des formats appropriés, date ou timestamp selon la précision souhaitée

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 291
    Points : 144
    Points
    144
    Par défaut
    Oui les champs date_heure sont bien des timestamp. Je regarde pour les DDL
    Merci pour le lien c'est pratique!

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonsoir,

    moi, en plus de la cohérence entre nom de CTE et Ref_Trurbine, ce qui me gène c'est le Full des jointures
    en fait , j'ai du mal à cerner l'objectif de ce SQL et me demande si une procédure ou une requête recursive ne serait pas plus appropriée

    de plus : à qui servent les TRIM ? les AS des colonnes alors que si le SELECT final n'était pas un SELECT * mais un SELECT indiquant les colonnes ...
    Bref ce SQL ressemble à une sorte de LIST sans en être un je me trompe ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 291
    Points : 144
    Points
    144
    Par défaut
    Bonjour,

    Le but c'est d'avoir pour chaque date_heure, chaque ref_turbine la valeur de puiss_active_prod sachant qu'il peut y avoir des date_heure existant sur T2, T4 pas sur T3

    Ca pourrait donner (par exemple)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    10h00  T2  4000 10h00 T3 50000 10h00 T4 5675
    10h10  T2  4020 10h10 T3 50010 10h10 T4 5275
                    10h20 T3 50000 10h20 T4 5475
    10h30  T2  4000 10h30 T3 50030
    10h40  T2  4006                10h40 T4 5075
    etc...

    Je vais essayer sans le trim et en nommant les colonnes à la place de select * pour voir

    Merci

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 126
    Points : 38 509
    Points
    38 509
    Billets dans le blog
    9
    Par défaut
    Déjà vous pouvez cerner le problème en exécutant chacune des CTE séparément pour voir ce que ca donne (avec la plage qui pose souci en perfs bien sur)

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 291
    Points : 144
    Points
    144
    Par défaut
    Bonjour,

    Chaque requête exécutée séparément est très rapide (quelques ms). Le souci se passe lorsque je rajoute "full" à join. Si je fais uniquement des "join" dans le select final ca fonctionne.

    Merci

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    c'est tout à fait le domaine d'une requête récursive un peu comme celle que j'ai proposé ici

    ceci devrait(<< conditionnel) donner pour chaque turbine son activité toutes les 10 minutes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    WITH RECURSIVE HEURES(H) AS (select :DEBUT AS H from RDB$DATABASE
                                        union all 
                                        select DATEADD(MINUTE,10,H) from HEURES 
                                        where H < :FIN
                                 )
    SELECT HEURES.H, REF_TURBINE_,COALESCE(PUISS_ACTIVE_PRODUITE,0) AS PUISS_ACTIVE_PRODUITE,
               COALESCE(VITESSE_VENT_NACELLE,0) AS VITESSE_VENT_NACELLE 
               FROM  HEURES LEFT JOIN DATA_10MIN T ON T.DATE_HEURE=HEURES.H 
               WHERE NOM_PROJET='x'
    la mise en tableau (c'est à dire toutes les turbines sur une même ligne) , on parle alors de crosstab , je ne maîtrise pas
    ici une réponse de Pierre Cornelius

    la seule réponse que je pourrais faire, mais qui s'approche seulement du résultat escomptée serait avec l'utilisation de LIST, et peut être en mettant des tabulations comme séparateurs


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    WITH RECURSIVE HEURES(H) AS (select :DEBUT AS H from RDB$DATABASE
                                        union all 
                                        select DATEADD(MINUTE,10,H) from HEURES 
                                        where H < :FIN
                                 ),
     TH AS (SELECT HEURES.H, REF_TURBINE_,COALESCE(PUISS_ACTIVE_PRODUITE,0) AS PUISS_ACTIVE_PRODUITE,
               COALESCE(VITESSE_VENT_NACELLE,0) AS VITESSE_VENT_NACELLE 
               FROM  HEURES LEFT JOIN DATA_10MIN T ON T.DATE_HEURE=HEURES.H 
               WHERE NOM_PROJET='x')
     
    SELECT H AS HEURE,LIST(REF_TURBINE||ASCII_CHAR(9)|| PUISS_ACTIVE_PRODUITE||ASCII_CHAR(9)||VITESSE_VENT_NACELLE,ASCII_CHAR(9)) FROM TH
    GROUP BY 1
    sans jeu d'essai (trop long à faire) difficile d'obtenir mieux, il manque certainement un fichier TURBINE (comme il y avait EMPLOYE pour le lien cité au début)
    à moins que un SELECT DISTINCT REF_TURBINE FROM DATA_10MIN WHERE NOM_PROJET='x' -- accessoirement AND DATE_HEURE BETWEEN :DEBUT AND :FIN serve de base à la requête récursive

    quelque chose comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH RECURSIVE HEURES(H,Turbine) AS (select DISTINCT :DEBUT AS H,D.REF_TURBINE  from RDB$DATABASE full join  DATA_10MIN D ON 1=1 AND                   D.NOM_PROJET='x' 
                                        union all 
                                        select DATEADD(MINUTE,10,H),REF_TURBINE from HEURES 
                                        where H < :FIN
                                 ),
    TH AS (SELECT HEURES.H, REF_TURBINE_,COALESCE(PUISS_ACTIVE_PRODUITE,0) AS PUISS_ACTIVE_PRODUITE,
               COALESCE(VITESSE_VENT_NACELLE,0) AS VITESSE_VENT_NACELLE 
               FROM  HEURES LEFT JOIN DATA_10MIN T ON T.DATE_HEURE=HEURES.H AND T.REF_TURBINE=HEURES.REF_TURBINE
               )
     
    .....

    comme le demande Escartefigue un DDL avec un petit jeu de données pour tester serait un gros +
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 291
    Points : 144
    Points
    144
    Par défaut
    Merci pour votre aide. Voici la requête qui fonctionne

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    WITH TC AS
      (SELECT DISTINCT d.DATE_HEURE
       FROM RDB$DATABASE
       FULL JOIN DATA_10MIN D ON 1=1
       AND D.NOM_PROJET = 'xS'
       WHERE d.DATE_HEURE BETWEEN '06.05.2016 08:00:0' AND '07.05.2016 10:00:00'),
         T2 AS
      (SELECT trim(REF_TURBINE_) AS REF_TURBINE_,
              DATE_HEURE AS DATE_HEURE,
              PUISS_ACTIVE_PRODUITE AS PUISS_ACTIVE_PRODUITE,
              VITESSE_VENT_NACELLE AS VITESSE_VENT_NACELLE
       FROM DATA_10MIN
       WHERE NOM_PROJET='xS'
         AND DATE_HEURE BETWEEN '06.05.2016 08:00:00' AND '07.05.2016 10:00:00'
         AND REF_TURBINE_='T5'
       ORDER BY DATE_HEURE),
         T3 AS
      (SELECT trim(REF_TURBINE_) AS REF_TURBINE__1,
              DATE_HEURE AS DATE_HEURE_1,
              PUISS_ACTIVE_PRODUITE AS PUISS_ACTIVE_PRODUITE_1,
              VITESSE_VENT_NACELLE AS VITESSE_VENT_NACELLE_1
       FROM DATA_10MIN
       WHERE NOM_PROJET='xS'
         AND DATE_HEURE BETWEEN '06.05.2016 08:00:00' AND '07.05.2016 10:00:00'
         AND REF_TURBINE_='T2'
       ORDER BY DATE_HEURE),
         T4 AS
      (SELECT trim(REF_TURBINE_) AS REF_TURBINE__2,
              DATE_HEURE AS DATE_HEURE_2,
              PUISS_ACTIVE_PRODUITE AS PUISS_ACTIVE_PRODUITE_2,
              VITESSE_VENT_NACELLE AS VITESSE_VENT_NACELLE_2
       FROM DATA_10MIN
       WHERE NOM_PROJET='xS'
         AND DATE_HEURE BETWEEN '06.05.2016 08:00:00' AND '07.05.2016 10:00:00'
         AND REF_TURBINE_='T4'
       ORDER BY DATE_HEURE),
         T5 AS
      (SELECT trim(REF_TURBINE_) AS REF_TURBINE__3,
              DATE_HEURE AS DATE_HEURE_3,
              PUISS_ACTIVE_PRODUITE AS PUISS_ACTIVE_PRODUITE_3,
              VITESSE_VENT_NACELLE AS VITESSE_VENT_NACELLE_3
       FROM DATA_10MIN
       WHERE NOM_PROJET='xS'
         AND DATE_HEURE BETWEEN '06.05.2016 08:00:00' AND '07.05.2016 10:00:00'
         AND REF_TURBINE_='T1'
       ORDER BY DATE_HEURE)
    SELECT *
    FROM TC
    LEFT JOIN T2 ON TC.DATE_HEURE = T2.DATE_HEURE
    LEFT JOIN T3 ON TC.DATE_HEURE = T3.DATE_HEURE_1
    LEFT JOIN T4 ON TC.DATE_HEURE = T4.DATE_HEURE_2
    LEFT JOIN T5 ON TC.DATE_HEURE = T5.DATE_HEURE_3

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    content que cette dernière requête fonctionne, mais elle me laisse perplexe !

    cette partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DISTINCT d.DATE_HEURE
       FROM RDB$DATABASE
       FULL JOIN DATA_10MIN D ON 1=1
       AND D.NOM_PROJET = 'xS'
       WHERE d.DATE_HEURE BETWEEN '06.05.2016 08:00:0' AND '07.05.2016 10:00:00'),
    à quoi sert RDB$DATABASE ? AMHA à rien, de plus ce que j'avais proposé est une requête RECURSIVE (qui est un mot clé et non un nom) pour obtenir toutes les heures entre EBUT et :FIN , soit entre '06.05.2016 08:00:0' AND '07.05.2016 10:00:00', pour moi, on peut très bien avoir un moment où aucune Turbine n'a de renseignement, or, j'aime être le plus générique possible

    Soit,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    WITH RECURSIVE HEURES(H) AS (SELECT CAST('06.05.2016 08:00:00' AS TIMESTAMP) AS H
                                                 FROM RDB$DATABASE
                                                 UNION ALL
                                                 SELEC DATEADD(MINUTE,10,H) FROM HEURES
                                                 WHERE H< CAST('07.05.2016 10:00:00' AS TIMESTAMP))
    Ensuite, aimant être le plus "générique" possible j'aurais aimé avoir toutes les turbines du projet d'où ma demande pour savoir s'il n'y avait pas une Table TURBINE
    TABLE TURBINE
    (ID_TURBINE ....,
    PROJET ....,
    ....
    );

    ce qui aurait donné quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    WITH RECURSIVE HEURES(H,ID_TURBINE) AS (SELECT CAST('06.05.2016 08:00:00' AS TIMESTAMP) AS H,T.ID_TURBINE
                                                 FROM RDB$DATABASE JOIN TURBINES T ON 1=1 AND T.PROJET='x'
                                                 UNION ALL
                                                 SELECT DATEADD(MINUTE,10,H),ID_TURBINE FROM HEURES
                                                 WHERE H< CAST('07.05.2016 10:00:00' AS TIMESTAMP))

    ou ma proposition de SELECT DISTINCT, moins efficace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WITH RECURSIVE HEURES(H,Turbine) AS 
                      (select DISTINCT :DEBUT AS H,D.REF_TURBINE 
                                from RDB$DATABASE  full join  DATA_10MIN D ON 1=1  AND  D.NOM_PROJET='x' 
                        union all 
                                 select DATEADD(MINUTE,10,H),REF_TURBINE from HEURES  where H < :FIN
                                 ),
    Avec un petit jeu d'essai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE TABLE TURBINES
    (
      ID_TURBINE Bigint NOT NULL,
      PROJET Varchar(10),
      CONSTRAINT PK_TURBINES_1 PRIMARY KEY (ID_TURBINE)
    );
     
    INSERT INTO TURBINES(ID_TURBINE,PROJET) VALUES (1,'X');
    INSERT INTO TURBINES(ID_TURBINE,PROJET) VALUES (2,'X');
    INSERT INTO TURBINES(ID_TURBINE,PROJET) VALUES (3,'X');
    INSERT INTO TURBINES(ID_TURBINE,PROJET) VALUES (4,'Xs');
    pour une tranche de 1 Heure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WITH RECURSIVE HEURES(H,ID_TURBINE) AS (SELECT CAST('06.05.2016 08:00:00' AS TIMESTAMP) AS H,ID_TURBINE
                                                 FROM RDB$DATABASE B JOIN TURBINES  ON 1=1 AND PROJET='X'
                                                 UNION ALL
                                                 SELECT DATEADD(MINUTE,10,H),ID_TURBINE FROM HEURES
                                                 WHERE H< CAST('06.05.2016 9:00:00' AS TIMESTAMP)) 
    SELECT * FROM HEURES
    cela me donne bien, par turbine 7 lignes (soit 21 au total)
    partant de là il est facile d'obtenir une requête ne contenant que les données recherchées

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT HEURES.H, REF_TURBINE_,COALESCE(PUISS_ACTIVE_PRODUITE,0) AS PUISS_ACTIVE_PRODUITE,
               COALESCE(VITESSE_VENT_NACELLE,0) AS VITESSE_VENT_NACELLE 
               FROM  HEURES LEFT JOIN DATA_10MIN T ON T.DATE_HEURE=HEURES.H  AND T.REF_TURBINE_=HEURES.ID_TURBINE;
    ou dans votre schéma de requête (que vous persistez à compliquer, TRIM, alias de colonnes inutiles, nom CTE différent de la turbine indiqué en clause ce qui augmente la confusion) cela donnerait pour la turbine T5, ceci si bien évidement une REF_TURBINE est unique à un projet
    (pour moi cela va de soit mais comme nous n'avons toujours pas le plaisir d'avoir le DDL )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        T5 AS  (SELECT  D.REF_TURBINE,D.HEURES.H,D.PUISS_ACTIVE_PRODUITE,D.VITESSE_VENT_NACELLE
                    FROM HEURES LEFT JOIN DATA_10MIN D ON D.DATE_HEURE=HEURES.H
                    WHERE  HEURES.ID_TURBINE='T5'),
    pour cela j'ai créé la table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TABLE DATA_10MN
    ( ID_TURBINE BIGINT,
      HEURE TIMESTAMP,
      PRODUCTION INTEGER,
      VENT INTEGER,
      CONSTRAINT PK_DATA_10MN
            PRIMARY KEY (ID_TURBINE,HEURE)
    );
    et insérer un peu (peu) de données

    pour la partie crosstab voici le résultat de la requête suivante (utilisation de flamerobin pour exporter le résultat dans un fichier .txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    WITH RECURSIVE HEURES(H,ID_TURBINE) AS (SELECT CAST('06.05.2016 08:00:00' AS TIMESTAMP) AS H,ID_TURBINE
                                                 FROM RDB$DATABASE B JOIN TURBINES  ON 1=1 AND PROJET='X'
                                                 UNION ALL
                                                 SELECT DATEADD(MINUTE,10,H),ID_TURBINE FROM HEURES
                                                 WHERE H<CAST('06.05.2016 9:00:00' AS TIMESTAMP)) 
    SELECT H,LIST(ID_TURBINE||ASCII_CHAR(9)||10.5||ASCII_CHAR(9)||0,ASCII_CHAR(9)) FROM HEURES
    GROUP BY H

    résultat en p.j. resultat.txt
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  13. #13
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Je pense que ceci pourrait répondre au besoin :

    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
    18
    19
    20
     
    SELECT 
    		trim(REF_TURBINE_)		as REF_TURBINE_
    	,	DATE_HEURE				as DATE_HEURE,
    	,	MAX(CASE WHEN REF_TURBINE_='T5' THEN PUISS_ACTIVE_PRODUITE END)	as PUISS_ACTIVE_PRODUITE_T5
    	,	MAX(CASE WHEN REF_TURBINE_='T5' THEN VITESSE_VENT_NACELLE END	as VITESSE_VENT_NACELLE_T5
    	,	MAX(CASE WHEN REF_TURBINE_='T2' THEN PUISS_ACTIVE_PRODUITE END)	as PUISS_ACTIVE_PRODUITE_T2
    	,	MAX(CASE WHEN REF_TURBINE_='T2' THEN VITESSE_VENT_NACELLE END	as VITESSE_VENT_NACELLE_T2
    	,	MAX(CASE WHEN REF_TURBINE_='T4' THEN PUISS_ACTIVE_PRODUITE END)	as PUISS_ACTIVE_PRODUITE_T4
    	,	MAX(CASE WHEN REF_TURBINE_='T4' THEN VITESSE_VENT_NACELLE END	as VITESSE_VENT_NACELLE_T4
    	,	MAX(CASE WHEN REF_TURBINE_='T1' THEN PUISS_ACTIVE_PRODUITE END)	as PUISS_ACTIVE_PRODUITE_T1
    	,	MAX(CASE WHEN REF_TURBINE_='T1' THEN VITESSE_VENT_NACELLE END	as VITESSE_VENT_NACELLE_T1
     
    FROM	DATA_10MIN
    WHERE	NOM_PROJET='x'
    	AND	DATE_HEURE BETWEEN '05.05.2016 08:00:00' AND '05.05.2016 10:00:00' 
    	AND REF_TURBINE_ IN ('T5', 'T2', 'T4', 'T1')
    GROUP BY 
    		trim(REF_TURBINE_)		
    	,	DATE_HEURE

  14. #14
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 377
    Points : 19 049
    Points
    19 049
    Par défaut
    Salut à tous.

    Je n'arrive pas à comprendre, ce sujet existe depuis le 02 juin 2016, et je n'ai pas reçu aucune alerte, sauf aujourd'hui.
    Comment faites-vous pour intervenir dans un sujet, sauf en venant consulter le forum ?

    En ce qui concerne la requête de "calou_33", je ne comprends pas trop l'intérêt de faire aussi compliqué.

    Voici en FireBird, la requête proposé par Escartefigue.
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    CREATE DATABASE '..\Data\Base.fdb' page_size 4096 DEFAULT CHARACTER SET ISO8859_1;
     
    -- =================================
    -- Création de la table 'DATA_10MIN'
    -- =================================
     
    CREATE TABLE DATA_10MIN (
    NOM_PROJET              VARCHAR(10)  NOT NULL collate fr_fr,
    REF_TURBINE             VARCHAR(10)  NOT NULL collate fr_fr,
    DATE_HEURE              TIMESTAMP    NOT NULL,
    PUISS_ACTIVE_PRODUITE   INTEGER      NOT NULL,
    VITESSE_VENT_NACELLE    INTEGER      NOT NULL
    );
     
    -- ===========================
    -- Insertion dans 'DATA_10MIN'
    -- ===========================
     
    insert into data_10min (nom_projet,ref_turbine,date_heure,puiss_active_produite,vitesse_vent_nacelle) values ('x','T1','2016-05-05 08:01:00',186, 10);
    insert into data_10min (nom_projet,ref_turbine,date_heure,puiss_active_produite,vitesse_vent_nacelle) values ('x','T1','2016-05-05 08:15:00',175, 15);
    insert into data_10min (nom_projet,ref_turbine,date_heure,puiss_active_produite,vitesse_vent_nacelle) values ('x','T2','2016-05-05 08:01:00',255, 11);
    insert into data_10min (nom_projet,ref_turbine,date_heure,puiss_active_produite,vitesse_vent_nacelle) values ('x','T2','2016-05-05 08:22:00',022, 14);
    insert into data_10min (nom_projet,ref_turbine,date_heure,puiss_active_produite,vitesse_vent_nacelle) values ('x','T3','2016-05-05 08:01:00',075,  0);
    insert into data_10min (nom_projet,ref_turbine,date_heure,puiss_active_produite,vitesse_vent_nacelle) values ('x','T3','2016-05-05 08:22:00',432, 17);
    insert into data_10min (nom_projet,ref_turbine,date_heure,puiss_active_produite,vitesse_vent_nacelle) values ('x','T4','2016-05-05 08:22:00',128, 12);
    insert into data_10min (nom_projet,ref_turbine,date_heure,puiss_active_produite,vitesse_vent_nacelle) values ('x','T4','2016-05-05 08:15:00',133, 23);
    insert into data_10min (nom_projet,ref_turbine,date_heure,puiss_active_produite,vitesse_vent_nacelle) values ('x','T5','2016-05-05 08:01:00',105, 33);
    insert into data_10min (nom_projet,ref_turbine,date_heure,puiss_active_produite,vitesse_vent_nacelle) values ('x','T5','2016-05-05 08:15:00',017, 18);
    insert into data_10min (nom_projet,ref_turbine,date_heure,puiss_active_produite,vitesse_vent_nacelle) values ('x','T6','2016-05-05 08:22:00',177, 13);
    insert into data_10min (nom_projet,ref_turbine,date_heure,puiss_active_produite,vitesse_vent_nacelle) values ('x','T6','2016-05-05 08:15:00',205, 27);
     
    -- ======================
    -- Vidage de 'data_10min'
    -- ======================
     
    select * from data_10min;
     
    NOM_PROJET REF_TURBINE                DATE_HEURE PUISS_ACTIVE_PRODUITE VITESSE_VENT_NACELLE
    ========== =========== ========================= ===================== ====================
    x          T1          2016-05-05 08:01:00.0000                    186                   10
    x          T1          2016-05-05 08:15:00.0000                    175                   15
    x          T2          2016-05-05 08:01:00.0000                    255                   11
    x          T2          2016-05-05 08:22:00.0000                     22                   14
    x          T3          2016-05-05 08:01:00.0000                     75                    0
    x          T3          2016-05-05 08:22:00.0000                    432                   17
    x          T4          2016-05-05 08:22:00.0000                    128                   12
    x          T4          2016-05-05 08:15:00.0000                    133                   23
    x          T5          2016-05-05 08:01:00.0000                    105                   33
    x          T5          2016-05-05 08:15:00.0000                     17                   18
    x          T6          2016-05-05 08:22:00.0000                    177                   13
    x          T6          2016-05-05 08:15:00.0000                    205                   27
     
     
    -- ============
    -- Requête N° 1
    -- ============
     
    select date_heure,
           ref_turbine,
           puiss_active_produite,
           vitesse_vent_nacelle
     
    from data_10min
     
    where nom_projet = 'x'
      and ref_turbine in ('T1','T2','T4','T5')
      and date_heure between '2016-05-05 08:00:00' and '2016-05-05 10:00:00'
     
    order by date_heure, ref_turbine
    ;
     
                   DATE_HEURE REF_TURBINE PUISS_ACTIVE_PRODUITE VITESSE_VENT_NACELLE
    ========================= =========== ===================== ====================
    2016-05-05 08:01:00.0000  T1                            186                   10
    2016-05-05 08:01:00.0000  T2                            255                   11
    2016-05-05 08:01:00.0000  T5                            105                   33
    2016-05-05 08:15:00.0000  T1                            175                   15
    2016-05-05 08:15:00.0000  T4                            133                   23
    2016-05-05 08:15:00.0000  T5                             17                   18
    2016-05-05 08:22:00.0000  T2                             22                   14
    2016-05-05 08:22:00.0000  T4                            128                   12
     
     
    -- ============
    -- Requête N° 2
    -- ============
     
     
    with cte as (
        select date_heure,
     
               max(case ref_turbine when 'T1' then puiss_active_produite else null end) as puiss_active_produite_t1,
               max(case ref_turbine when 'T2' then puiss_active_produite else null end) as puiss_active_produite_t2,
               max(case ref_turbine when 'T4' then puiss_active_produite else null end) as puiss_active_produite_t4,
               max(case ref_turbine when 'T5' then puiss_active_produite else null end) as puiss_active_produite_t5,
     
               max(case ref_turbine when 'T1' then vitesse_vent_nacelle  else null end) as vitesse_vent_nacelle_t1,
               max(case ref_turbine when 'T2' then vitesse_vent_nacelle  else null end) as vitesse_vent_nacelle_t2,
               max(case ref_turbine when 'T4' then vitesse_vent_nacelle  else null end) as vitesse_vent_nacelle_t4,
               max(case ref_turbine when 'T5' then vitesse_vent_nacelle  else null end) as vitesse_vent_nacelle_t5
     
        from data_10min
     
        where nom_projet = 'x'
          and ref_turbine in ('T1','T2','T4','T5')
          and date_heure between '2016-05-05 08:00:00' and '2016-05-05 10:00:00'
     
        group by date_heure
        order by date_heure
    )
     
    select * from cte;
     
                   DATE_HEURE PUISS_ACTIVE_PRODUITE_T1 PUISS_ACTIVE_PRODUITE_T2 PUISS_ACTIVE_PRODUITE_T4 PUISS_ACTIVE_PRODUITE_T5 VITESSE_VENT_NACELLE_T1 VITESSE_VENT_NACELLE_T2 VITESSE_VENT_NACELLE_T4 VITESSE_VENT_NACELLE_T5
    ========================= ======================== ======================== ======================== ======================== ======================= ======================= ======================= =======================
    2016-05-05 08:01:00.0000                       186                      255                   <null>                      105                      10                      11                  <null>                      33
    2016-05-05 08:15:00.0000                       175                   <null>                      133                       17                      15                  <null>                      23                      18
    2016-05-05 08:22:00.0000                    <null>                       22                      128                   <null>                  <null>                      14                      12                  <null>
     
     
    exit
    Expected end of statement, encountered EOF
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  15. #15
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par Artemus24 Voir le message
    Je n'arrive pas à comprendre, ce sujet existe depuis le 02 juin 2016, et je n'ai pas reçu aucune alerte, sauf aujourd'hui.
    Comment faites-vous pour intervenir dans un sujet, sauf en venant consulter le forum ?
    la deuxième solution pour moi, en début de journée, vers midi et selon mes humeurs l'après-midi

    Citation Envoyé par Artemus24 Voir le message
    je ne comprends pas trop l'intérêt de faire aussi compliqué.
    je sais que je propose plus compliqué mais c'est parce que depuis le début je trouve la solution trop restrictive :
    - si un autre projet (vous remarquerez que l'on est passé du projet 'x' au projet 'xs' à un moment) ou si l'on ajoute une nouvelle turbine tout est à refaire
    - le cas aucune données pour les turbines à un moment T n'est pas prévu (d'où la proposition de partie récursive)
    bref je voulais faire quelque chose de plus générique :
    "avoir un tableau des activités des turbines toutes les 10 minutes pour un projet donné"


    si je m'étais contenté du départ j'aurais certainement proposé quelque chose comme la proposition de aieeeuuuuu


    Quant à la partie finale (présentation des résultats sur une seule ligne) elle devrait se faire par "cross tabulation" ce n'est pas implémenté avec la version 2.5 et je n'ai fait aucune recherche à ce sujet pour la version 3 (si un retraité a le temps )
    ceci étant avec la version 2.5 la crosstabulation est réalisable avec quelques procédures et table temporaire
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  16. #16
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 377
    Points : 19 049
    Points
    19 049
    Par défaut
    Salut SergioMaster.

    Je vais devoir intervenir directement sur le forum, au lieu d'attendre l'email récapitulatif de la journée envoyé à 0H03.

    Citation Envoyé par Artemus24
    En ce qui concerne la requête de "calou_33", je ne comprends pas trop l'intérêt de faire aussi compliqué.
    Je ne m'adressais pas à toi, SergioMaster, mais à calou_33.
    Je ne comprends pas trop l'intérêt de sa requête.

    En ce qui te concerne, oui, en effet, ta proposition est plus riche.
    C'est la finalité qui m'intéresse et non m'attarder sur un problème ponctuel, difficile à résoudre.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

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

Discussions similaires

  1. [SQL 2005] Requetes ne se termine jamais
    Par lanjolanjo dans le forum Administration
    Réponses: 2
    Dernier message: 16/06/2009, 21h46
  2. Problème Requete SQL et QuickReport
    Par arnaud_verlaine dans le forum C++Builder
    Réponses: 7
    Dernier message: 07/01/2004, 09h31
  3. requete sql
    Par autumn319 dans le forum ASP
    Réponses: 22
    Dernier message: 10/09/2003, 16h46
  4. Paramètre requete SQL (ADOQuery)
    Par GaL dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/07/2002, 11h24
  5. Resultat requete SQL
    Par PierDIDI dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/07/2002, 13h43

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