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 :

[SCD] Dimension à Evolution Lente [2012]


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2008
    Messages : 24
    Points : 28
    Points
    28
    Par défaut [SCD] Dimension à Evolution Lente
    Bonjour,

    Je cherche depuis quelques temps à mettre à jour une SCD (dimension à évolution lente) à partir d'une seule requête SQL plutôt qu'à partir d'un job Datastage (mon ETL) mais malheureusement je sèche lamentablement.

    Ci-dessous ma problématique :

    Données sources :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Id     Date        Valeur
    01    01.01.2016    A
    01    02.01.2016    A
    01    04.01.2016    B
    01    05.01.2016    B
    01    10.01.2016    A
    01    11.01.2016    A
    02    01.01.2016    A
    02    02.01.2016    A
    02    03.01.2016    B
    Résultat attendu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Id    DateDeb       DateFin    Valeur
    01    01.01.2016  02.01.2016    A
    01    04.01.2016  05.01.2016    B
    01    10.01.2016  11.01.2016    A
    02    01.01.2016  02.01.2016    A
    02    03.01.2016  03.01.2016    B
    J'ai bien tenté de m'inspirer des "Gaps et Islands" mais sans séquence numérique je n'ai pas réussi à faire grand chose. Donc si l'un/une d'entre vous arrive à faire cela avec une requête SQL, je suis preneur.

    Merci d'avance

  2. #2
    Membre éclairé Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant Senior dba sql server & Microsoft Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 332
    Points : 723
    Points
    723
    Par défaut
    Bonjour,
    Pas sur que tu sois au bon endroit mais j'ai déjà écrit ce genre de requêtes.
    ce qui est sur c'est qu'il ne faut pas utiliser le composant d'origine qui a des performances complètement pourries. ce composant n'est à utiliser que sur des tables avec quelques centaines de lignes après c'est galère.
    Par contre, tu as des techniques simples pour le faire au niveau de ton package (genre avec une table intermédiaire)
    Pour répondre à ta question, tu dois utiliser un MERGE.
    Voici un exemple
    cordialement,
    Loïc BERNARD
    Consultant Senior dba sql server & Microsoft Business Intelligence



    Il n'y a jamais de problèmes, il n'y a que des solutions!

  3. #3
    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,

    Voici une solution :

    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
     
    WITH Coupures AS (
    	SELECT 
    			id
    		,	date
    		,	valeur
    		,	CASE WHEN LAG(valeur) OVER(PARTITION BY id ORDER BY date) = valeur THEN 0 ELSE 1 END AS cpr
    	FROM LaTable
    )
    ,
    Groupement AS (
    	SELECT 
    			A.id
    		,	A.date
    		,	A.valeur	
    		,	SUM(B.cpr) AS grp
    	FROM Coupures A
    	LEFT JOIN Coupures B
    		ON B.id = A.id
    		AND B.date <= A.date
    	GROUP BY 
    			A.id
    		,	A.date
    		,	A.valeur
    )	
    SELECT	
    			id
    		,	MIN(date) as Debut
    		,	MAX(date) as Fin
    		,	valeur			
    FROM	Groupement
    GROUP BY 
    		id
    	,	valeur
    	,	grp
    ORDER BY id, MIN(date)
    A partir de 2014, on peut éviter l'autojointure en faisant directement une somme cumulée croissante (SUM(...) OVER(PARTITION BY ... ORDER BY...))

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2008
    Messages : 24
    Points : 28
    Points
    28
    Par défaut
    Excellent !

    Nous commençons seulement à migrer nos SQL Server 2008 vers 2012 et je ne connaissais pas les fonctions LAG/LEAD. Je découvre également avec bonheur que les notions de FIRST/LAST_VALUE sont de la partie ! :-)

    Merci pour ton aide

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/03/2014, 22h22
  2. [Vxi3] dimensions a evolution lente
    Par morocoboy dans le forum Designer
    Réponses: 3
    Dernier message: 23/01/2013, 08h11
  3. Réponses: 5
    Dernier message: 09/02/2012, 11h40
  4. Dimension à variation lente et champ de flux date
    Par nanod dans le forum kettle/PDI
    Réponses: 1
    Dernier message: 18/05/2009, 17h40
  5. Réponses: 6
    Dernier message: 22/04/2009, 16h30

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