Из значения даты и времени агрегируйте все записи за следующий час - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть табличная модель данных SSAS, которая состоит из структуры таблицы фактов и измерений.В этой модели есть измерение Date и измерение Time, на которые ссылается каждая таблица Fact.

Я хотел бы объединить данные Fact из одной таблицы на основе временного интервала в 1 час после определенной строки вдругая таблица фактов с использованием DAX Measure.

Модель выглядит примерно так:

DimDate                    
+---------+------------+   
| DateKey | DateValue  |   
+---------+------------+   
|       0 | 2019-01-01 |   
|       1 | 2019-01-02 |   
+---------+------------+   


DimTime
+---------+-----------+
| TimeKey | TimeValue |
+---------+-----------+
|       0 | 00:25     |
|       1 | 12:05     |
|       2 | 12:15     |
|       3 | 12:30     |
|       4 | 13:00     |
|       5 | 17:20     |        
|       6 | 17:50     |        
|       7 | 19:35     |        
|       8 | 19:45     |        
|       9 | 23:50     |        
|      10 | 23:55     |        
+---------+-----------+             

FactEvent
+---------+---------+-----------------+
| DateKey | TimeKey |      Type       |
+---------+---------+-----------------+
|       0 |       1 | Aggregate       | (2019-01-01 12:05)
|       0 |       5 | Aggregate       | (2019-01-01 17:20)
|       0 |       7 | Don't Aggregate | (2019-01-01 19:35)
|       0 |       9 | Aggregate       | (2019-01-01 23:50)
+---------+---------+-----------------+


FactToAggregate
+---------+---------+-------+
| DateKey | TimeKey | Value |
+---------+---------+-------+
|       0 |       2 |     3 | (2019-01-01 12:15)
|       0 |       3 |     7 | (2019-01-01 12:30)
|       0 |       4 |     5 | (2019-01-01 13:00)
|       0 |       6 |     2 | (2019-01-01 17:50)
|       0 |       8 |     4 | (2019-01-01 19:45)
|       0 |      10 |     4 | (2019-01-01 23:55)
|       1 |       0 |     4 | (2019-01-02 00:25)
+---------+---------+-------+

И результаты, которые я получу, будут следующими:

                     (Filtered)
+---------+---------+-----------+------------------+------------------+-----+
| DateKey | TimeKey |   Type    |   DateTimeFrom   |    DateTimeTo    | Sum |
+---------+---------+-----------+------------------+------------------+-----+
|       0 |       1 | Aggregate | 2019-01-01 12:05 | 2019-01-01 13:05 |  15 | (Sum of FactToAggregate row 1, 2, 3)
|       0 |       5 | Aggregate | 2019-01-01 17:20 | 2019-01-01 18:20 |   2 | (Sum of FactToAggregate row 4)
|       0 |       9 | Aggregate | 2019-01-01 23:50 | 2019-01-02 00:50 |   8 | (Sum of FactToAggregate row 6, 7)
+---------+---------+-----------+------------------+------------------+-----+

IЯ могу создать таблицу с DAX, которая возвращает соответствующие значения DateTimeFrom и DateTimeTo, используя addcolumns, хотя впоследствии эти столбцы нельзя использовать в filter, чтобы затем вернуть правильный контекст фильтра для calculate, выдавая ошибку:

Столбец «DateTimeFrom» не может быть найден или не может использоваться в этом выражении.

Так как я могу использовать соответствующий часовой интервалв качестве фильтра агрегации для возврата относительного sum?

1 Ответ

0 голосов
/ 30 сентября 2019

Я предлагаю это решение:

Вот модель:

enter image description here

Увеличить на DateTimeTable:

DateTimeTable = GENERATESERIES(DATE(2019;01;01);DATE(2019;01;02);(1/(24*60)))

Тогда вы устанавливаете День;Месяц и год, если необходимо ...

Увеличение на FactEvents:

enter image description here

DateTimeFrom = RELATED('Date'[ DateValue])+RELATED('Time'[TimeValue])
DateTimeTo = [DateTimeFrom]+Time(1;0;0)

Увеличение на FactToAggregate:

enter image description here

FTADateTime = RELATED('Date'[ DateValue])+RELATED('Time'[TimeValue])

Затем мера:

Aggregation = 
// Retrieve the Values from the current Row of FactEvent
VAR VrMinDateTime = VALUES(FactEvent[DateTimeFrom]) 
VAR VrMaxDateTime = VALUES(FactEvent[DateTimeTo])
RETURN
// Then Filter the FactToAggregate table wrap in a "if" to avoid total row level generating an error
IF(
    HASONEVALUE(FactEvent[DateTimeFrom]);
    CALCULATE( 
        Sum(FactToAggregate[ Value ]);
        FILTER(
            ALL(FactToAggregate);
            FactToAggregate[FTADateTime]>VrMinDateTime
            &&
            FactToAggregate[FTADateTime]<VrMaxDateTime
        )
    );
    BLANK()
)

Затем вы можете увидеть результат:

enter image description here

...