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 :

Requête sur dates d'historisation


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    mai 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : mai 2004
    Messages : 22
    Points : 15
    Points
    15
    Par défaut Requête sur dates d'historisation
    Bonjour,

    j'ai une table contenant un identifiant, une date de début, une date de fin et un libellé:

    Ex:
    1 01/01/2015 31/12/2099 libellé

    et une autre avec les détails par rapport à l'identifiant de la première (identifiant, date de début, date de fin, étiquette, valeur) :

    Ex :

    1 01/01/2015 31/12/2018 grade secrétaire
    1 01/01/2019 31/12/2099 grade directrice
    1 01/01/2015 31/12/2017 service service_1
    1 01/01/2018 31/12/2099 service service_2

    Comment peut-on faire en SQL pour obtenir :

    1 01/01/2015 31/12/2017 secrétaire service_1
    1 01/01/2018 31/12/2018 secrétaire service_2
    1 01/01/2019 31/12/2099 directrice service_2

    Si, toutefois, cela est possible.

    Merci.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Consultant Teradata
    Inscrit en
    septembre 2008
    Messages
    8 191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : septembre 2008
    Messages : 8 191
    Points : 17 078
    Points
    17 078
    Par défaut
    Malheureusement SQL-Server est très en retard sur les implémentations temporelles, les périodes, les fonctions de comparaisons...
    Donc il faut écrire une requête moche.

    Pour des questions de praticité j'ai rajouté un jour à vos dates de fin, car dans les périodes l'intervalle est ouvert à gauche et fermé à droite.
    J'ai aussi rajouté des données avec un id 2, plus complexe, avec des trous et des périodes ne se chevauchant pas.

    Les données :
    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
    create table MaTable
    ( id        integer
    , dt_deb    date
    , dt_fin    date
    , libelle   varchar(10)
    , valeur    varchar(10)
    );
     
    insert into MaTable values
    (1, '2015-01-01', '2019-01-01', 'grade'  , 'secrétaire'),
    (1, '2019-01-01', '2099-12-31', 'grade'  , 'directrice'),
    (1, '2015-01-01', '2018-01-01', 'service', 'service_1' ),
    (1, '2018-01-01', '2099-12-31', 'service', 'service_2' ),
    (2, '2016-01-01', '2019-01-01', 'grade'  , 'secrétaire'),
    (2, '2019-01-01', '2021-01-01', 'grade'  , 'directrice'),
    (2, '2022-01-01', '2099-12-31', 'grade'  , 'directrice'),
    (2, '2015-01-01', '2020-01-01', 'service', 'service_1' ),
    (2, '2020-01-01', '2023-01-01', 'service', 'service_2' );
    La requête :
    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
    with cte_union (id, dt_deb) as
    (
    select id, dt_deb from MaTable union
    select id, dt_fin from MaTable
    )
      ,  cte_lead (id, dt_deb, dt_fin) as
    (
      select id, dt_deb
           , lead(dt_deb, 1) over(partition by id order by dt_deb asc)
        from cte_union
    )
        select mn.id
             , mn.dt_deb
             , mn.dt_fin
             , t1.valeur     as grade
             , t2.valeur     as service
          from cte_lead as mn
     left join MaTable  as t1   on t1.id      = mn.id
                               and t1.libelle = 'grade'
                               and t1.dt_deb  < mn.dt_fin -- overlaps
                               and t1.dt_fin  > mn.dt_deb
     left join MaTable  as t2   on t2.id      = mn.id
                               and t2.libelle = 'service'
                               and t2.dt_deb  < mn.dt_fin  -- overlaps
                               and t2.dt_fin  > mn.dt_deb
         where mn.dt_fin is not null
    order by 1 asc, 2 asc;
     
    id  dt_deb      dt_fin      grade       service  
    --  ----------  ----------  ----------  ---------
     1  2015-01-01  2018-01-01  secrétaire  service_1
     1  2018-01-01  2019-01-01  secrétaire  service_2
     1  2019-01-01  2099-12-31  directrice  service_2
     2  2016-01-01  2019-01-01  secrétaire  service_1
     2  2019-01-01  2020-01-01  directrice  service_1
     2  2020-01-01  2021-01-01  directrice  service_2
     2  2021-01-01  2022-01-01              service_2
     2  2022-01-01  2023-01-01  directrice  service_2
     2  2023-01-01  2099-12-31  directrice

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    mai 2002
    Messages
    20 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 20 900
    Points : 49 650
    Points
    49 650
    Billets dans le blog
    1
    Par défaut
    Ou passer par une fonction de type UDF comme OVERLAPS...
    https://blog.developpez.com/sqlpro/p...chement_d_inte

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    mai 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : mai 2004
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Merci pour les infos,

    je vais investiguer tout cela :-)

Discussions similaires

  1. [REQ] Requête sur date et heure
    Par benazerty dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 26/06/2006, 13h34
  2. [sql server] requête sur dates et heures (format du résultat
    Par isachat666 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/02/2006, 13h48
  3. Requète sur dates compliquée ...
    Par itklif2 dans le forum Requêtes
    Réponses: 7
    Dernier message: 28/11/2005, 23h31
  4. [ADO] Requète sur dates
    Par cdlr27 dans le forum Bases de données
    Réponses: 3
    Dernier message: 26/01/2005, 22h39
  5. Requête sur date
    Par guenfood dans le forum Access
    Réponses: 11
    Dernier message: 08/12/2004, 16h11

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