Найти перекрывающиеся диапазоны дат и добавить соответствующие метрики производительности для измерения эффективности - PullRequest
2 голосов
/ 19 марта 2020
+----------+------------------+-------+---------+-------------+------------+
|  Name    |  Booking Type    |  Job  | Loading | Start Date  |  End date  |
+----------+------------------+-------+---------+-------------+------------+
| John     | Chargeable       | job1  |      20 | 04/11/2019  | 31/01/2020 |
| John     | Chargeable       | job2  |     100 | 01/10/2019  | 31/12/2019 |
| John     | Chargeable       | job3  |     100 | 14/10/2019  | 01/11/2019 |
| John     | Chargeable       | job6  |      50 | 29/07/2019  | 30/09/2019 |
| John     | Chargeable       | job7  |      50 | 29/07/2019  | 30/09/2019 |
| John     | Vacation/Holiday | job8  |     100 | 10/01/2020  | 10/02/2020 |
| John     | Chargeable       | job9  |     100 | 23/03/2020  | 30/07/2020 |
| John     | Chargeable       | job10 |      50 | 20/01/2020  | 20/03/2020 |
| John     | Chargeable       | job11 |      20 | 03/02/2020  | 20/03/2020 |
| John     | Chargeable       | job12 |      30 | 22/01/2020  | 20/03/2020 |
| Kimberly | Chargeable       | job11 |      20 | 03/02/2020  | 20/03/2020 |
| Kimberly | Chargeable       | job13 |     100 | 22/01/2020  | 20/03/2020 |
| Kimberly | Chargeable       | job14 |     100 | 22/04/2020  | 20/04/2020 |
+----------+------------------+-------+---------+-------------+------------+

Для каждой строки я пытаюсь определить, перекрывается ли диапазон дат работы с другими заданиями. Если есть перекрытие, я хочу суммировать сумму загрузки для всех перекрывающихся заданий.

Это то, что я пробовал, создал новый столбец в таблице:

loading Status =
VAR staffname = 'Staff Booking'[Name ]
VAR jobstart = 'Staff Booking'[Start Date].[Date]
VAR jobend = 'Staff Booking'[End Date].[Date]
VAR bookingtype = 'Staff Booking'[Booking Type ]
RETURN
    IF (
        CALCULATE (
            SUM ( 'Staff Booking'[Loading] ),
            FILTER ( 'Staff Booking', 'Staff Booking'[Name ] = staffname ),
            FILTER ( 'Staff Booking', 'Staff Booking'[Booking Type ] == "Chargeable" ),
            FILTER (
                'Staff Booking',
                'Staff Booking'[Start Date].[Date] <= jobend
                    && jobstart <= 'Staff Booking'[End Date].[Date]
            )
        ) > 100
            && bookingtype = "Chargeable",
        "Overbooked",
        "Normal"
    )

Однако это код пропускается в данном конкретном случае:

Gantt chart view of a sample timeline

Темно-синий означает, что задание перегружено (> 100) в соответствии с приведенной выше формулой DAX, а светло-синий означает, что задание выполнено. Нормальный (100).

Однако темно-синий (первый и второй) здесь не верен, потому что они никогда не получают больше 100 в любой период времени. Причина, по которой они помечены как перегруженные, заключается в том, что формула Dax объединяет загрузку для всех различных периодов времени, которые перекрываются.

например, задание 12 = задание 12 + задание 10 + задание 1 + задание 20 + задание 20 = 120

, что неверно, поскольку задание 12 всегда равно 100 в любой период времени

например, задание 12 = задание 12 + задание 10 + задание 1 = 100

и задание 12 = задание 12 + Задание 10 + Задание 20 = 100

1) Есть ли способ настроить формулу DAX или любой другой метод, чтобы убедиться, что она исправляет вышеприведенное, так что задание 12 не следует считать перебронированным в приведенном выше сценарии

2) В качестве побочного эффекта исправления приведенного выше сценария возникает случай, когда

, если Job 20 загрузка установлена ​​на 50 ,

, тогда сумма загрузки задания 12 будет отображаться в двух разных фазах:

фаза 1) работа 12 = работа 12 + работа 10 + работа 1 = 100 (обычная)

фаза 2) Работа 12 = Работа 12 (30) + Работа 10 (50) + Работа 20 (50) = 130 (перебронировано)

В этом случае формула DAX s следует взять наивысшую фазу и поставить в графе «Перебронировано»

1 Ответ

1 голос
/ 20 марта 2020

Это будет проще, если вы используете таблицу календаря. Например, вы можете рассчитать нагрузку для выбранного Name следующим образом:

Load =
VAR ThisDate = SELECTEDVALUE ( Dates[Date] )
RETURN
    CALCULATE (
        SUM ( Booking[Loading] ),
        FILTER (
            Booking,
            Booking[Start Date] <= ThisDate &&
            Booking[End date] >= ThisDate &&
            Booking[Booking Type] = "Chargeable"
        )
    )

Вот визуализация этого с Dates[Date] на оси x и Load для значений.

Load Example

Теперь, поскольку это рассчитывается для каждого Dates[Date] в отдельности, ваш статус загрузки не должен перекрываться, как у вас, и показатель может быть таким простым:

loading Status = IF ( [Load] > 100, "Overbooked", "Normal" )

Изменить:

Чтобы сделать это в виде вычисляемого столбца, вам нужно смотреть на каждый день во время работы и видеть, если [Load] переходит 100:

LoadingStatus =
VAR TempTable =
    ADDCOLUMNS (
        FILTER (
            Dates,
            Dates[Date] <= Booking[End date] &&
            Dates[Date] >= Booking[Start Date]
        ),
        "DayLoad", CALCULATE ( [Load], ALLEXCEPT ( Booking, Booking[Name] ) )
    )
RETURN
    IF ( MAXX ( TempTable, [DayLoad] ) > 100, "Overloaded", "Nomral" )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...