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

Développement SQL Server Discussion :

Lier des informations de deux tables différentes évoluant dans le temps


Sujet :

Développement SQL Server

  1. #1
    Candidat au Club
    Homme Profil pro
    Automaticien
    Inscrit en
    juillet 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : juillet 2020
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Lier des informations de deux tables différentes évoluant dans le temps
    Bonjour à tous,

    Tout d'abord je tiens à dire que mon expérience en MSSQL est très très scolaire.
    Voici ma problématique :
    J'ai deux tables différentes qui sont alimentées continuellement par un système.
    #1 : La première table va enregistrer les informations de mesure, par exemple des températures.
    #2 : La seconde table va enregistrer les évènements, par exemple les défauts de température haute.

    Je souhaite pouvoir relever les valeurs de la température X de la table #1 dans le cas où il y a un défaut de cette température X sur la table #2.
    Le premier problème est que ces tables ne sont pas liées, même pas par la colonne [chrono].
    Le second problème est que les informations de la table #2 sont ponctuels : il y aura à un instant T "défaut présent" et à un instant T+1 "défaut disparu".

    Voici ma requête actuelle :
    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
    SELECT DISTINCT
    T1.[TS],
    T1.[Name],
    T1.[Value],
    T2.TS,
    T2.Nature,
    T2.Description
     
    FROM [MaBase].[dbo].[Table1] AS T1
    FULL JOIN [MaBase].[dbo].[Table2] AS T2
    ON T1.Quality = T2.Quality
    WHERE	YEAR(T2.TS) = YEAR(GETDATE())
    AND		MONTH(T2.TS) = MONTH(GETDATE())
    AND		DAY(T2.TS) = DAY(GETDATE())
    AND		T1.Name = 'Variable temperature 1234'
    AND		T2.Nature = 'Temperature 1234'
    AND		(T2.Description = 'Defaut temperature tres haute' OR T2.Description = 'Defaut temperature tres basse')
     
    ORDER BY T1.TS

    Avez-vous une méthode pour parvenir à mes fins?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    janvier 2009
    Messages
    5 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : janvier 2009
    Messages : 5 040
    Points : 12 279
    Points
    12 279
    Par défaut
    Bonjour,
    Pour commencer, pourquoi utiliser year, month et day dans ta requête, au lieu de comparer directement la date ?

    Pour la question initiale il faudrait commercer par nous donner la structure des tables, un jeu de test et le résultat attendu.
    Mais si j'ai bien compris il faut chercher dans T2 les lignes:
    1. Dont la première est un défaut constaté
    2. Dont la deuxième est une fin de défaut et sa date est supérieure à celle du point 1
    3. Qui n'ont pas d'autres lignes de T2 dont la date est encadrée par les lignes du point 1 et 2

    Et à partir de là chercher toutes les lignes de T1 dont la date est encadrée par les lignes des point 1 et 2.
    J'ai bon ?

    Tatayo.

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    9 367
    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 : 9 367
    Points : 35 467
    Points
    35 467
    Billets dans le blog
    3
    Par défaut
    bonjour,

    ATTENTION :
    • mettre des restrictions (clause WHERE) sur des colonnes de tables OUTER transforme implicitement la jointure en INNER.
      donc en fonction du résultat souhaité : soit, écrivez directement une jointure INNER, ce sera plus clair, soit déportez les restrictions dans la clause de jointure ON.
    • tester des libellés est risqué et contre-performant, il est préférable dans la mesure du possible de tester des codes.

  4. #4
    Candidat au Club
    Homme Profil pro
    Automaticien
    Inscrit en
    juillet 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : juillet 2020
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Tout d'abord merci de vos retours.

    En effet year, month et day ne sont plus nécessaires, je les utilisais avant pour récupérer le jour J-1.
    Le résultat attendu est quelque chose comme ceci :
    T1.TS T2.Nature T1.Value T2.Description
    2020-07-31 06:23:35.000 Temperature 1234 34 Defaut temperature tres haute
    2020-07-31 07:09:02.000 Temperature 1234 35 Defaut temperature tres haute
    2020-07-31 07:27:55.000 Temperature 1234 34 Defaut temperature tres haute
    2020-07-31 07:29:50.000 Temperature 1234 33 Defaut temperature tres haute

    L'idée est en fait de se servir des informations de présence défaut de T2 et récupérer toutes les valeurs d'une température définie de T1 comprises dans les périodes où T2 indique un défaut. Si c'est clair..
    Sachant que plusieurs plages de défauts peuvent apparaître au cours de la journée.

    Donc oui tatayo, c'est ça. Je ne vois juste pas comment faire, SQL a une logique qui m'échappe..

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2020
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : février 2020
    Messages : 32
    Points : 96
    Points
    96
    Par défaut
    J'ai du mal à saisir.
    Il n'y à selon toi aucun lien entre T1 et T2, à quoi correspond donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON T1.Quality = T2.Quality
    Tu nous parle ensuite de périodes.
    Si j'ai bien compris tu as donc dans la table T2 :

    T2.TS : 10h34, T2.Des : 'Defaut haute'
    T2.TS : 10h35, T2.Des : 'Defaut haute'
    T2.TS : 10h37, T2.Des : 'Fin Défaut'
    T2.TS : 10h39, T2.Des : 'Defaut basse'
    T2.TS : 10h40, T2.Des : 'Fin Défaut'
    T2.TS : 10h45, T2.Des : 'Defaut haute'
    T2.TS : 10h45, T2.Des : 'Defaut haute'
    T2.TS : 10h40, T2.Des : 'Fin Défaut'

    Ce qui représenterait 3 périodes en défaut à l'intérieur desquelles tu veux toutes les températures de T1?

    Si la logique SQL t'échappes c'est tout d'abord dû à cette modélisation un peu "exotique"

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2020
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : février 2020
    Messages : 32
    Points : 96
    Points
    96
    Par défaut
    Si j'ai globalement bien compris ton besoin voici la modélisation (que j'ai essayé de comprendre) et la solution que je peux te fournir.
    Sous réserve que tu fasses bien un lien "manuel" entre T1.Name et T2.nature (meme si, comme le dit escartefigue, tester des libellés c'est pas top)
    Et également d'avoir bien supposer et interpréter et déduit ton modèle de donnée quant aux renseignements donnés.

    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
    --Ta table T1
    CREATE TABLE [DBO].[T_RELEVE_TEMP](
    	[DATE_RELEVE] [datetime2](7) NULL,
    	[NOM_TEMP] [varchar](50) NULL,
    	[VALEUR_TEMP] [int] NULL
    ) ON [PRIMARY]
    GO
     
    --Ta table T2
    CREATE TABLE [dbo].[T_DEFAUT_TEMP](
    	[DATE_DEFAUT] [datetime2](7) NULL,
    	[NATURE] [varchar](50) NULL,
    	[DESC_DEFAUT] [varchar](50) NULL
    ) ON [PRIMARY]
    GO
    Je les ai alimentées de cette façon
    T_RELEVE_TEMP

    2020-07-31 08:00:10.0000000 Temp 1234 31
    2020-07-31 08:00:20.0000000 Temp 1234 33
    2020-07-31 08:00:29.0000000 Temp 1234 32
    2020-07-31 08:00:50.0000000 Temp 1234 31
    2020-07-31 08:02:10.0000000 Temp 1234 24
    2020-07-31 08:02:30.0000000 Temp 1234 22
    2020-07-31 08:03:30.0000000 Temp 1234 24
    2020-07-31 08:06:00.0000000 Temp 1234 35

    T_DEFAUT_TEMP

    2020-07-31 08:00:10.0000000 Event 1234 Temp Haute
    2020-07-31 08:00:30.0000000 Event 1234 Temp Haute
    2020-07-31 08:01:00.0000000 Event 1234 Fin Defaut
    2020-07-31 08:02:05.0000000 Event 1234 Temp Basse
    2020-07-31 08:02:10.0000000 Event 1234 Temp Basse
    2020-07-31 08:02:50.0000000 Event 1234 Temp Basse
    2020-07-31 08:03:35.0000000 Event 1234 Fin Defaut
    2020-07-31 08:05:00.0000000 Event 1234 Temp Haute
    2020-07-31 08:06:30.0000000 Event 1234 Temp Haute
    2020-07-31 08:06:30.0000000 Event 1234 Fin Defaut

    Et voici la requête pour récupérer chaque enregistrement inclut dans chaque période en défaut.

    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
    with TPERIODE as (
    	-- Premiere requete pour récupérer toutes les periodes pour X debut de periode pour une date de fin (Si plusieurs défaut avant l'enregistrement fin de defaut)
    	SELECT	P_DEBUT.DATE_DEFAUT AS Debut_Periode_Multi 
    		,P_DEBUT.NATURE AS Periode_Nature
    		,P_DEBUT.DESC_DEFAUT AS Debut_Periode_Desc
    		,P_FIN.DATE_DEFAUT AS Fin_Periode
    		,P_FIN.DESC_DEFAUT AS Fin_Periode_Desc
    		, row_number() over (partition by P_DEBUT.NATURE,P_DEBUT.DESC_DEFAUT,P_FIN.DATE_DEFAUT,P_FIN.NATURE,P_FIN.DESC_DEFAUT order by P_DEBUT.DATE_DEFAUT ASC) rn 
    		--utilisation de row_number pour classer les eventuelles debut de periode pour une fin de periode donnée par ordre croissant
    	FROM T_DEFAUT_TEMP P_DEBUT
    	INNER JOIN T_DEFAUT_TEMP P_FIN
    		ON P_DEBUT.NATURE = P_FIN.NATURE
    	AND P_DEBUT.DESC_DEFAUT LIKE 'Temp%'
    	AND P_FIN.DESC_DEFAUT = 'Fin Defaut'
    	AND P_DEBUT.DATE_DEFAUT < P_FIN.DATE_DEFAUT
    	--recuperation de la premiere fin de periode de defaut pour chaque debut de periode possible
    	AND P_FIN.DATE_DEFAUT = (SELECT MIN(DATE_DEFAUT)						
    							FROM T_DEFAUT_TEMP P_FIN_MIN 
    							WHERE P_FIN_MIN.NATURE = P_FIN.NATURE 
    							AND P_DEBUT.DATE_DEFAUT < P_FIN_MIN.DATE_DEFAUT 
    							AND P_FIN_MIN.DESC_DEFAUT = P_FIN.DESC_DEFAUT)
         )
    SELECT Periode_Nature,Debut_Periode_Desc,Debut_Periode_Multi Debut_Periode, Fin_Periode, RELTEMP.NOM_TEMP, RELTEMP.DATE_RELEVE, RELTEMP.VALEUR_TEMP
    FROM TPERIODE 
    INNER JOIN T_RELEVE_TEMP RELTEMP
    	ON RELTEMP.NOM_TEMP = 'Temp 1234' AND TPERIODE.Periode_Nature = 'Event 1234'
    	AND RELTEMP.DATE_RELEVE BETWEEN TPERIODE.Debut_Periode_Multi AND TPERIODE.Fin_Periode
    WHERE RN = 1 -- pour ne prendre que le début de periode le plus ancien pour chaque periode identifié
    ORDER BY Debut_Periode_Multi;
    Pour le résultat suivant

    Nature Periode défaut Début periode Fin periode Nom temp Date relevé Valeur relevée
    Event 1234 Temp Haute 2020-07-31 08:00:10.0000000 2020-07-31 08:01:00.0000000 Temp 1234 2020-07-31 08:00:10.0000000 31
    Event 1234 Temp Haute 2020-07-31 08:00:10.0000000 2020-07-31 08:01:00.0000000 Temp 1234 2020-07-31 08:00:20.0000000 33
    Event 1234 Temp Haute 2020-07-31 08:00:10.0000000 2020-07-31 08:01:00.0000000 Temp 1234 2020-07-31 08:00:29.0000000 32
    Event 1234 Temp Haute 2020-07-31 08:00:10.0000000 2020-07-31 08:01:00.0000000 Temp 1234 2020-07-31 08:00:50.0000000 31
    Event 1234 Temp Basse 2020-07-31 08:02:05.0000000 2020-07-31 08:03:35.0000000 Temp 1234 2020-07-31 08:02:10.0000000 24
    Event 1234 Temp Basse 2020-07-31 08:02:05.0000000 2020-07-31 08:03:35.0000000 Temp 1234 2020-07-31 08:02:30.0000000 22
    Event 1234 Temp Basse 2020-07-31 08:02:05.0000000 2020-07-31 08:03:35.0000000 Temp 1234 2020-07-31 08:03:30.0000000 24
    Event 1234 Temp Haute 2020-07-31 08:05:00.0000000 2020-07-31 08:06:30.0000000 Temp 1234 2020-07-31 08:06:00.0000000 35

    Ceci dit sans avoir de vrai relation entre tes deux tables il faudra écrire une requête différentes pour chaque relation "manuel" codé ici en dur.

    Mavoune.

  7. #7
    Candidat au Club
    Homme Profil pro
    Automaticien
    Inscrit en
    juillet 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : juillet 2020
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Eh bien Mavoune,

    Un grand merci à toi ! Tu as très bien compris ma problématique et ta requête fonctionne parfaitement !
    J'ai juste rajouté mes comparaisons de dates pour n'avoir les informations que sur la journée.
    Maintenant il me reste juste à trouver une façon d'en récupérer soit une valeur toutes les X secondes ou bien la valeur mini/maxi de chaque période pour ne pas polluer le résultat.

    Encore merci !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 29/06/2016, 17h34
  2. Réponses: 1
    Dernier message: 19/07/2012, 00h37
  3. Comparaison des colonnes de deux tables différentes
    Par Chakalaka dans le forum PL/SQL
    Réponses: 11
    Dernier message: 22/11/2011, 18h27
  4. Réponses: 2
    Dernier message: 30/04/2009, 13h46
  5. Réponses: 3
    Dernier message: 11/07/2005, 16h20

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