Club Power BI

Please login or click SIGN UP FOR FREE to create your PowerBIUG account to join this user group.
Expand all | Collapse all

Chevauchement de plage horaire

Jump to Best Answer
  • 1.  Chevauchement de plage horaire

    Posted 20 days ago
    Bonjour à tous,

    Je sollicite votre aide pour un problème pour lequel je bloque.

    J'ai des techniciens réalisant plusieurs prestations, les unes après les autres, dans une même journée. De nombreuses informations remontent notamment l'heure de début et l'heure de fin d'une prestation. Je souhaiterais connaitre les techniciens qui démarrent une nouvelle prestation avant d'avoir clôturé la précédente ; savoir si dans une même journée le technicien a fait des chevauchements de prestation.

    À l'image d'un tableau Excel que j'utilise où une vérification pouvait être faite à l'aide de la fonction "sommeprod", je souhaitais utiliser SUMX et FILTER mais je n'arrive pas à adapter cette logique et je pense faire fausse route.

    Auriez-vous une piste à me conseiller, la table regroupe notamment les champs suivant :

    Id_technicien;
    Date intervention :
    Heure_début_prestation:
    Heure_fin_prestation.

    Merci pour votre aide


    ------------------------------
    Jean-Charles Brulé
    ------------------------------


  • 2.  RE: Chevauchement de plage horaire

    Bronze Contributor
    Posted 20 days ago

    On peut construire une colonne calculée qui pour chaque ligne vient vérifier si d'autres lignes définissent une période concourante.

    L'utilisation de variables permet d'éviter le recours à la fonction EARLIER pour récupérer le contexte de la ligne lors de l'iteration de la table. Plus verbeux mais plus lisible à mon sens. Le résultat est une colonne à 1 pour les lignes ou il y a chevauchement, et vide pour les autres.

    Overlap = 
    VAR _itemHeure_fin_prestation = Interventions[Heure_fin_prestation]
    VAR _itemHeure_debut_prestation = Interventions[Heure_début_prestation]
    VAR _itemdate = Interventions[Date intervention]
    VAR _itemId_technicien = Interventions[Id_technicien]
    VAR _interventionconcourantes =
        FILTER (
            ALL ( Interventions ),
            Interventions[Heure_début_prestation] <= _itemHeure_fin_prestation
                && Interventions[Heure_fin_prestation] >= _itemHeure_debut_prestation
                && Interventions[Date intervention] = _itemdate
                && Interventions[Id_technicien] = _itemId_technicien
        )
    RETURN
        IF ( COUNTROWS ( _interventionconcourantes ) > 1, 1 )


    ------------------------------
    Bertrand d'Arbonneau
    ------------------------------



  • 3.  RE: Chevauchement de plage horaire

    Posted 19 days ago
    Bonjour

    Merci pour votre retour précis,

    Effectivement je n'avais pas imaginé cette logique.

    Malheureusement, je l'ai essayé et même en laissant tourner toute cette nuit, le travail était toujours en cours ce matin. La table fait 1.2 million de lignes.

    Auriez-vous une solution pour optimiser cette colonne calculée ?

    À la place de FILTER, le CALCULATETABLE serait-il préférable ?

    Cordialement,

    ------------------------------
    Jean-Charles Brulé
    DAF
    ------------------------------



  • 4.  RE: Chevauchement de plage horaire

    Bronze Contributor
    Posted 19 days ago
    Edited by Bertrand d'Arbonneau 19 days ago

    En passant par une mesure, on peut peut-être limiter le nombre de calculs au contexte selectionné et ainsi obtenir une performance plus acceptable.

    Nbre de chevauchements = 
    COUNTAX(
        ADDCOLUMNS (
            SUMMARIZE (
                Interventions,
                Interventions[Date intervention],
                Interventions[Id_technicien]
            ),
            "overlap",
                VAR _currentgroup =
                    CALCULATETABLE ( Interventions )
                RETURN
                    SUMX (
                        _currentgroup,
                        VAR _itemHeure_fin_prestation = Interventions[Heure_fin_prestation]
                        VAR _itemHeure_debut_prestation = Interventions[Heure_début_prestation]
                        VAR _interventionconcourantes =
                            FILTER (
                                _currentgroup,
                                Interventions[Heure_début_prestation] <= _itemHeure_fin_prestation
                                    && Interventions[Heure_fin_prestation] >= _itemHeure_debut_prestation
                            )
                        RETURN
                            IF ( COUNTROWS ( _interventionconcourantes ) > 1, 1 )
                    )
        ),
        [overlap]
    )


    ------------------------------
    Bertrand d'Arbonneau
    ------------------------------



  • 5.  RE: Chevauchement de plage horaire

    Posted 18 days ago
    J'ai au moins un résultat, mais cela reste excessivement long.

    Merci quand même de m'avoir aidé.

    Je vais passer par une autre voie, peut être en amont par une vue SQL.


    ------------------------------
    Jean-Charles Brulé
    DAF
    ------------------------------



  • 6.  RE: Chevauchement de plage horaire
    Best Answer

    Bronze Contributor
    Posted 18 days ago

    J'ai réexaminé la formule pour la colonne calculée. Cette version pourrait être plus efficace. La fonction FILTER opère maintenant sur une table déjà filtrée par le context de la ligne (variable _currentgroup). Le filtrage final sera donc plus rapide, mais il faudra au préalable calculer cette table. N'ayant pas de jeu de donnée sur lequel faire les test, difficile d'anticiper la performance. Mais à essayer.

    Overlap = 
            VAR _itemHeure_fin_prestation = Interventions[Heure_fin_prestation]
            VAR _itemHeure_debut_prestation = Interventions[Heure_début_prestation]
            VAR _currentgroup =
                CALCULATETABLE (
                    Interventions,
                    ALLEXCEPT (
                        Interventions,
                        Interventions[Id_technicien],
                        Interventions[Date intervention]
                    )
                )
            VAR _interventionconcourantes =
                FILTER (
                    _currentgroup,
                    Interventions[Heure_début_prestation] <= _itemHeure_fin_prestation
                        && Interventions[Heure_fin_prestation] > _itemHeure_debut_prestation
                )
            RETURN
                IF(COUNTROWS ( _interventionconcourantes )>1,1)


    ------------------------------
    Bertrand d'Arbonneau
    ------------------------------



  • 7.  RE: Chevauchement de plage horaire

    Posted 18 days ago
    La différence est impressionnante (20 secondes). La décomposition de la tache en deux partie fait vraiment gagner en temps de traitement.

    L'utilisation de tableau dans des variables est très efficace.

    A retenir dans ce type de configuration !

    Merci encore pour le temps passé et la transmission de votre savoir !



    Cordialement,

    ------------------------------
    Jean-Charles Brulé
    DAF
    ------------------------------