Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
3 years ago
Solved

Counting the rows in a category

Hello everyone, I'm trying to create a calculated column where I count the numer of consecutive weeks that an employee is in a determined quartile. It should be a DAX calculated column. To take into account, an different employees may start working at different id_weeks.

To add on, everytime that an employee changes from quartile, the counter is reseted.

As an example, I have to be able to create the column "Weeks on quartile" in the following table.

 

id_weekid_employeequartileWeeks on quartile
11q11
21q12
31q21
41q11
32q31
42q41
52q42
23q21
33q22
43q23
53q24
63q15

 

Thanks in advance!

  • Hi Anonymous ,
    you can modify the measure like so:

    WeeksInQuartile = 
    VAR __previousWeek = 'Table'[id_week] - 1
    VAR __Result = 
    RANKX (
        FILTER( 
            'Table',
            'Table'[id_employee] = EARLIER('Table'[id_employee])
                && 'Table'[quartile] = EARLIER('Table'[quartile])
                && 'Table'[quartile] = CALCULATE(MAX('Table'[quartile]), FILTER(all('Table'), 'Table'[id_week] = __previousWeek))
        ),
        'Table'[id_week],
        'Table'[id_week],
        ASC
    )
    Return
    __Result




  • Hello Anonymous ,
    thanks for taking the time to point out the error in the previous formula.
    Please try out this new approach:

    WeeksInQuartile =
    VAR __StartRangeWeek =
        MAXX (
            FILTER (
                'Table',
                'Table'[id_employee] = EARLIER ( 'Table'[id_employee] )
                    && 'Table'[id_week] <= EARLIER ( 'Table'[id_week] )
                    && 'Table'[quartile] <> EARLIER ( 'Table'[quartile] )
            ),
            'Table'[id_week]
        )
    VAR __EndRangeWeek =
        MINX (
            FILTER (
                'Table',
                'Table'[id_employee] = EARLIER ( 'Table'[id_employee] )
                    && 'Table'[id_week] >= EARLIER ( 'Table'[id_week] )
                    && 'Table'[quartile] <> EARLIER ( 'Table'[quartile] )
            ),
            'Table'[id_week]
        )
    VAR __Result =
        RANKX (
            FILTER (
                'Table',
                'Table'[id_employee] = EARLIER ( 'Table'[id_employee] )
                    && 'Table'[quartile] = EARLIER ( 'Table'[quartile] )
                    && 'Table'[id_week] > __StartRangeWeek
                    && 'Table'[id_week]
                        < IF (
                            __EndRangeWeek = BLANK (),
                            EARLIER ( 'Table'[id_week] ) + 1,
                            __EndRangeWeek
                        )
            ),
            'Table'[id_week],
            'Table'[id_week],
            ASC
        )
    RETURN
        __Result

    Performance will probably be terrible on large datasets.
    A Power Query solution would probably be much faster in this case.

     

11 Replies

  • Shaurya's avatar
    Shaurya
    Icon for Memorable Member rankMemorable Member

    Hi Anonymous,

     

    You can use the following formula:

     

    Weeks on Quartile = RANKX(FILTER('Table','Table'[id_employee]=EARLIER('Table'[id_employee]) && 'Table'[quartile]=EARLIER('Table'[quartile])),'Table'[id_week],,ASC,DENSE)

     

    Result:

     

     

    Works for you? Mark this post as a solution if it does!

    • Anonymous's avatar
      Anonymous
      Not applicable

      Hi! It works partially, because I need the counter to be reseted everytime a driver changes from quartile, for exaple:

      id_weekid_employeequartileWeeks on quartile
      11q11
      21q12
      31q21
      41q11

       

      Thanks!

      • Shaurya's avatar
        Shaurya
        Icon for Memorable Member rankMemorable Member

        Hi Anonymous,

         

        I can see that the numbers in my previous reply match with those in your post. Can you please elaborate this driver change scenario?

  • ImkeF's avatar
    ImkeF
    Icon for Community Champion rankCommunity Champion

    Hello Anonymous ,
    thanks for taking the time to point out the error in the previous formula.
    Please try out this new approach:

    WeeksInQuartile =
    VAR __StartRangeWeek =
        MAXX (
            FILTER (
                'Table',
                'Table'[id_employee] = EARLIER ( 'Table'[id_employee] )
                    && 'Table'[id_week] <= EARLIER ( 'Table'[id_week] )
                    && 'Table'[quartile] <> EARLIER ( 'Table'[quartile] )
            ),
            'Table'[id_week]
        )
    VAR __EndRangeWeek =
        MINX (
            FILTER (
                'Table',
                'Table'[id_employee] = EARLIER ( 'Table'[id_employee] )
                    && 'Table'[id_week] >= EARLIER ( 'Table'[id_week] )
                    && 'Table'[quartile] <> EARLIER ( 'Table'[quartile] )
            ),
            'Table'[id_week]
        )
    VAR __Result =
        RANKX (
            FILTER (
                'Table',
                'Table'[id_employee] = EARLIER ( 'Table'[id_employee] )
                    && 'Table'[quartile] = EARLIER ( 'Table'[quartile] )
                    && 'Table'[id_week] > __StartRangeWeek
                    && 'Table'[id_week]
                        < IF (
                            __EndRangeWeek = BLANK (),
                            EARLIER ( 'Table'[id_week] ) + 1,
                            __EndRangeWeek
                        )
            ),
            'Table'[id_week],
            'Table'[id_week],
            ASC
        )
    RETURN
        __Result

    Performance will probably be terrible on large datasets.
    A Power Query solution would probably be much faster in this case.

     

    • Anonymous's avatar
      Anonymous
      Not applicable

      Thanks for your time, that works perfectly!

  • ImkeF's avatar
    ImkeF
    Icon for Community Champion rankCommunity Champion

    Hi Anonymous ,
    You could use this DAX for that column:

    WeeksInQuartile = 
    RANKX (
        FILTER (
            'Table',
            'Table'[id_employee] = EARLIER ( 'Table'[id_employee] )
                && 'Table'[quartile] = EARLIER ( 'Table'[quartile] )
        ),
        'Table'[id_week],
        'Table'[id_week],
        ASC
    )



    • Anonymous's avatar
      Anonymous
      Not applicable

      Hi! It works partially, because I need the counter to be reseted everytime a driver changes from quartile, for exaple:

      id_weekid_employeequartileWeeks on quartile
      11q11
      21q12
      31q21
      41q11


      Thanks!

  • ImkeF's avatar
    ImkeF
    Icon for Community Champion rankCommunity Champion

    Hi Anonymous ,
    you can modify the measure like so:

    WeeksInQuartile = 
    VAR __previousWeek = 'Table'[id_week] - 1
    VAR __Result = 
    RANKX (
        FILTER( 
            'Table',
            'Table'[id_employee] = EARLIER('Table'[id_employee])
                && 'Table'[quartile] = EARLIER('Table'[quartile])
                && 'Table'[quartile] = CALCULATE(MAX('Table'[quartile]), FILTER(all('Table'), 'Table'[id_week] = __previousWeek))
        ),
        'Table'[id_week],
        'Table'[id_week],
        ASC
    )
    Return
    __Result