计算列-从过滤器的日期范围过滤MAX

时间:2019-02-26 21:09:32

标签: powerbi dax powerbi-desktop

请考虑以下表格-其中一台打印机,另一台来自抄表的页数:

Printers
+------------+---------+--------+
| Printer ID |  Make   | Model  |
+------------+---------+--------+
|          1 | Xerox   | ABC123 |
|          2 | Brother | DEF456 |
|          3 | Xerox   | ABC123 |
+------------+---------+--------+


Meter Read
+-------+------------+-----------+------------+
| Index | Printer ID | Poll Date | Mono Pages |
+-------+------------+-----------+------------+
|     1 |          1 | 1/1/2019  |       1000 |
|     2 |          2 | 1/1/2019  |        800 |
|     3 |          3 | 1/1/2019  |      33000 |
|     4 |          1 | 1/2/2019  |       1100 |
|     5 |          2 | 1/2/2019  |        850 |
|     6 |          3 | 1/2/2019  |      34000 |
|     7 |          1 | 1/3/2019  |       1200 |
|     8 |          2 | 1/3/2019  |        900 |
|     9 |          3 | 1/3/2019  |      35000 |
|    10 |          1 | 1/4/2019  |       1400 |
|    11 |          2 | 1/4/2019  |        950 |
|    12 |          3 | 1/4/2019  |      36000 |
|    13 |          1 | 1/5/2019  |       1800 |
|    14 |          2 | 1/5/2019  |       1000 |
|    15 |          3 | 1/5/2019  |      36500 |
|    16 |          1 | 1/6/2019  |       2000 |
|    17 |          2 | 1/6/2019  |       1050 |
|    18 |          3 | 1/6/2019  |      37500 |
|    19 |          1 | 1/7/2019  |       2100 |
|    20 |          2 | 1/7/2019  |       1100 |
|    21 |          3 | 1/7/2019  |      39000 |
|    22 |          1 | 1/8/2019  |       2200 |
|    23 |          2 | 1/8/2019  |       1150 |
|    24 |          3 | 1/8/2019  |      40000 |
+-------+------------+-----------+------------+

在Power BI报表中,有一个“日期”表:

Dates = CALENDAR(DATE(2019, 1, 1), DATE(2019, 1, 31))
我正在用作切片器的

。目标是在切片器的日期范围内最终获得单色页面增量。我可以通过“抄表”表上一个相当复杂的计算列来获取每个抄表之间的差异:

PagesSinceLastPoll = 
IF(
    ISBLANK(
        LOOKUPVALUE(
            'Meter Read'[Mono Pages],
            'Meter Read'[Index], CALCULATE(
                MAX(
                    'Meter Read'[Index]
                ), FILTER(
                    'Meter Read',
                    'Meter Read'[Index] < EARLIER('Meter Read'[Index])
                        && 'Meter Read'[Printer ID] = EARLIER('Meter Read'[Printer ID] )
                )
            )
        )
    ),
    BLANK(),
    'Meter Read'[Mono Pages] - 
    LOOKUPVALUE(
        'Meter Read'[Mono Pages],
        'Meter Read'[Index], CALCULATE(
            MAX(
                'Meter Read'[Index]
            ), FILTER(
                'Meter Read',
                'Meter Read'[Index] < EARLIER('Meter Read'[Index])
                    && 'Meter Read'[Printer ID] = EARLIER('Meter Read'[Printer ID] )
            )
        )
    )
)

但是超过10,000行的性能非常差。我想在过滤后的日期范围内获取设备的最大值和最小值,而仅减去它,但是我很难获得正确的值。到目前为止,我的DAX一直使我从ENTIRE表中获得最大值,而不是从切片器中的日期中筛选出的表中获取最大值。到目前为止,我尝试过的所有内容都有一些变化:

MaxInRange =
CALCULATE (
    MAX ( 'Meter Read'[Mono Pages] ),
    FILTER ( 'Meter Read', 'Meter Read'[Printer ID] = Printers[Printer ID] )
)

总结一下:如果我有一个从1/2/2019开始到1/5/2019结尾的切片器,则打印机ID 1的最大值应为1800,而不是2200。

有想法吗?

2 个答案:

答案 0 :(得分:1)

这样计算出的列可以更有效地完成:

PagesSinceLastPoll = 
VAR PrevRow =
    TOPN(1,
        FILTER('Meter Read',
            'Meter Read'[PrinterID] = EARLIER('Meter Read'[PrinterID]) &&
            'Meter Read'[PollDate] < EARLIER('Meter Read'[PollDate])
        ),
        'Meter Read'[PollDate]
    )
RETURN 'Meter Read'[MonoPages] - SELECTCOLUMNS(PrevRow, "Pages", 'Meter Read'[MonoPages])

使用这些数字,可以将两个日期之间的页数汇总为该日期。


如果您想跳过该步骤并直接进行测量,请尝试以下操作:

PagesInPeriod = 
VAR StartDate = FIRSTDATE(Dates[Date])
VAR EndDate = LASTDATE(Dates[Date])
RETURN
SUMX(
    VALUES('Meter Read'[PrinterID]),
    CALCULATE(
        MAX('Meter Read'[MonoPages]),
        Dates[Date] = EndDate
    )
    -
    CALCULATE(
        MAX('Meter Read'[MonoPages]),
        Dates[Date] < StartDate
    )
)

请注意,如果您使用Dates[Date] = StartDate,那么您将无法使用。您想计算之前首次包含日期的最大页面数。


这两种方法应给出相同的结果:

Matrix Visual

答案 1 :(得分:0)

亚历克西斯的方法是处理此问题的正确方法(谢谢!),但是我做了很小的修改。由于可能没有在结束日期读取数据,因此我们需要查看该日期或该日期之前的内容,否则它将结束日期的最大值视为零。最终的代码将变为:

PagesInPeriod = 
VAR StartDate = FIRSTDATE(Dates[Date])
VAR EndDate = LASTDATE(Dates[Date])
RETURN
SUMX(
    VALUES('Meter Read'[PrinterID]),
    CALCULATE(
        MAX('Meter Read'[MonoPages]),
        Dates[Date] <= EndDate
    )
    -
    CALCULATE(
        MAX('Meter Read'[MonoPages]),
        Dates[Date] < StartDate
    )
)
相关问题