Forum Discussion

ryan25r9's avatar
ryan25r9
Helper I
6 years ago

Measure Efficiency -- Get distinct values, average per single date, then sum the averages

Hey everyone,

 

I'm trying to find a way to refactor this measure to make it more efficient, since it's currently pretty slow. I've been spinning my wheels, so any help is greatly appreciated.

 

We need to get distinct values per Employee & Date because the TLG table also has a more granular line level, and Workday Days is just per Employee & Date Worked.

 

The general idea here is that two different employees can have a different workday per date, because one might be in a country that has different holidays or weekends from the other. So in order to get the real total workdays for "Hours per Day" denominators etc, I need to find average workdays for each date.

 

EVALUATE

VAR DistinctEmpDays = 

		SUMMARIZE(
        		TLG
                , TLG[Date Worked], TLG[Employee ID], TLG[Workday Days]
        )
        
VAR AvgDays = /* Average workdays per single day */

        GROUPBY(
        		DistinctEmpDays
                , [Date Worked]
                , "AvgWorkdays"
                , AVERAGEX( CURRENTGROUP(), [Workday Days] ) 
        )
        
VAR Total = /* Sum daily avg for total workdays */

		SUMX( AvgDays, [AvgWorkdays] )
                
RETURN  
		ROW("Test", Total)

 

8 Replies

  • mahoneypat's avatar
    mahoneypat
    Microsoft Employee

    Please try this measure instead.

     

    NewMeasure = Sumx(Values(TLG[Date]), calculate(average(TLG[Workday Days])))

     

    If this works for you, please mark it as the solution.  Kudos are appreciated too.  Please let me know if not.

    Regards,

    Pat

    • ryan25r9's avatar
      ryan25r9
      Helper I

      Thank you, but this won't work. It doesn't change the granularity to Employee & Date Worked, so it's aggregating millions of duplicates.

  • v-lionel-msft's avatar
    v-lionel-msft
    Community Support

    Hi ryan25r9 ,

     

    Or like this?

    Measure = 
    VAR x = 
    AVERAGEX(
        FILTER(
            TLG,
            TLG[Date Worked] = SELECTEDVALUE(TLG[Date Worked])
        ),
        TLG[Workday Days]
    )
    RETURN
    ROW(
        "Test",
        SUMX(
            TLG,
            x
        )
    )

     

    Best regards,
    Lionel Chen

    If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.

    • ryan25r9's avatar
      ryan25r9
      Helper I

      Sorry, this doesn't quite get there either. It doesn't account for there being duplicate TLG[Workday Days] per Date Worked & Employee.

       

      Probably helps to give an example. Starting dataset:

      Employee IDDate WorkedWorkday DaysTLP ID
      49101/05/20010
      49101/06/200.54
      49101/06/200.5941
      49101/07/201331
      49101/08/201596
      49101/08/2012537
      1140201/06/201319
      1140201/06/201782
      1140201/07/201331
      1140201/08/201841
      9982101/05/20010
      9982101/06/201319
      9982101/07/2012537
      9982101/07/201596
      9982101/07/201941
      272901/05/201331
      272901/05/2011931
      272901/06/200.5841

       

      Distinct values of Employee ID, Date Worked, & Workday Days:

      Employee IDDate WorkedWorkday Days
      49101/05/200
      49101/06/200.5
      49101/07/201
      49101/08/201
      1140201/06/201
      1140201/07/201
      1140201/08/201
      9982101/05/200
      9982101/06/201
      9982101/07/201
      272901/05/201
      272901/06/200.5

       

      AVERAGE Workday Days by day:

      Date WorkedAverage Workday Days
      01/05/200.333
      01/06/200.750
      01/07/201.000
      01/08/201.000

       

      Lastly, the SUM of averages, making the expected result of the measure here:

      3.083
      • mahoneypat's avatar
        mahoneypat
        Microsoft Employee

        Thanks for providing sample data and output.  This measure should work for you in a table with Dates on the rows.

         

        NewMeasure =
        VAR __summary =
        ADDCOLUMNS (
        SUMMARIZE ( TLG, TLG[Employee ID], TLG[Date Worked] ),
        "AvgHrs", CALCULATE ( AVERAGE ( TLG[Workday Days] ) )
        )
        RETURN
        AVERAGEX ( __summary, [AvgHrs] )

         

        If this works for you, please mark it as solution.  Kudos are appreciated too.  Please let me know if not.

        Regards,

        Pat