2016-11-23 5 views
0

Я пытаюсь перенести отчет из Excel в Power BI, и я надеюсь, что кто-то может мне помочь, поскольку я новичок в DAX.Максимальное совпадение DAX без связи

У меня есть две таблицы и одна (давайте назовем ее таблицей A) содержит столбец запланированной даты начала/времени для событий, в то время как другой содержит фактическую дату начала/времени тех же событий. Как правило, разница между запланированным и фактическим временем начала составляет всего несколько минут.

Мне нужно, чтобы соответствовать ближайшим Действительная дата начала/времени из таблицы B в запланированное начало Дата/время в таблице А.

Там нет существующих столбцов, которые можно использовать, чтобы создать связь между двумя таблицами ,

Если я могу найти самое близкое фактическое время начала и потянуть его в таблицу А, тогда я могу создать отношения с этим.

В Excel я хотел бы сделать это с помощью формулы массива, таких как это: (здесь я просто предполагающего все в колонке А каждую таблицу)

{=Index(TableB!A:A,match(min(abs(TableB!A:A-TableA!A1)),abs(TableB!:A:A-TableA!A1),0),1)} 

я нашел следующий код DAX в Интернете, но он вернет только следующее нижнее значение, даже если есть более близкое значение, которое выше.

If (
Hasonevalue (TableA[A]), 
Calculate (
Max (TableB[A]), 
Filter (TableB, TableB[A] <= Values (TableA[A])) 
) 
) 

Я также попытался выяснить способ сделать это, если я строю даты/времени таблицу, которая содержит каждую минуту диапазона дат, мои обложки данных (около 2 лет) на но, как я сказал, Я новичок в DAX и не смог понять это.

Есть ли способ использовать что-то похожее на (min (abs (часть формулы excel в DAX (как и у этих функций) для вычисления этого в вычисленном столбце? Возможно ли это без существующих отношений или будет Я должен продолжать делать эту часть работы в Excel каждый раз, когда я хочу, чтобы обновить этот отчет?

Любая помощь очень ценится.

ответ

0

Создание вычисляемого столбца в Planned таблице, назовем его ActualClosestDate и использовать выражение:

ActualClosestDate = 
    IF (
     DATEDIFF (
      CALCULATE (
       MAX (TableB[Actual]), 
       FILTER (TableB, [Planned] >= [Actual] && TableA[Event] = TableB[Event]) 
      ), 
      [Planned], 
      SECOND 
     ) 
      < DATEDIFF (
       [Planned], 
       CALCULATE (
        MIN (TableB[Actual]), 
        FILTER (TableB, [Planned] <= [Actual] && TableA[Event] = TableB[Event]) 
       ), 
       SECOND 
      ), 
     CALCULATE (
      MAX (TableB[Actual]), 
      FILTER (TableB, [Planned] >= [Actual] && TableA[Event] = TableB[Event]) 
     ), 
     CALCULATE (
      MIN (TableB[Actual]), 
      FILTER (TableB, [Planned] <= [Actual] && TableA[Event] = TableB[Event]) 
     ) 
    ) 

Где:

  • [Planned] является Запланированная дата начала/время колонна в TableA
  • [Actual] является фактическая колонка Дата начала/Время в TableB

Заменить в соответствии с моделью.

Если у вас нет столбца «Событие» в каждой таблице, подавите это условие в функциях фильтров.

ОБНОВЛЕНИЕ: Вычисление трех разных столбцов может повысить производительность, а не выполнять вычисления в одном выражении.

BeforePlanned = 
DATEDIFF (
    CALCULATE (
     MAX (TableB[Actual]), 
     FILTER (TableB, [Planned] >= [Actual] && TableA[Event] = TableB[Event]) 
    ), 
    [Planned], 
    SECOND 
) 

AfterPlanned = 
DATEDIFF (
    [Planned], 
    CALCULATE (
     MIN (TableB[Actual]), 
     FILTER (TableB, [Planned] <= [Actual] && TableA[Event] = TableB[Event]) 
    ), 
    SECOND 
) 

ActualClosestDate = 
IF (
    [BeforePlanned] < [AfterPlanned], 
    CALCULATE (
     MAX (TableB[Actual]), 
     FILTER (TableB, [Planned] >= [Actual] && TableA[Event] = TableB[Event]) 
    ), 
    CALCULATE (
     MIN (TableB[Actual]), 
     FILTER (TableB, [Planned] <= [Actual] && TableA[Event] = TableB[Event]) 
    ) 
) 

Можно даже разделить его на несколько столбцов, то есть столбец, чтобы получить предыдущую дату фактического и столбец, чтобы получить следующую фактическую дату, то вам просто необходимо:

ActualClosestDate = 
IF ([BeforePlanned] < [AfterPlanned], [PreviousActualDate], [NextActualDate]) 

Позвольте мне знать, если это поможет.

+0

Благодарим за это. Я вижу, как это работает, и я немного раздражен. Я не думал об этом, так как это очень просто! Однако у меня 15,400 строк в моих данных и недостаточно памяти, чтобы рассчитать это по всем им, что для меня несколько удивительно. Я пойду и исследую решение этого. Может быть, просто больше ОЗУ ... –

+0

@NeilScrivener, одним из решений может быть создание отношений между обеими таблицами, но я вижу, что в обеих таблицах нет общего столбца. Вы можете попробовать разделить выражение в нескольких столбцах. –

+0

@NeilScrivener, проверьте мое редактирование. Это может помочь вам. –