根据Location列和Date确定Origin和Destination

时间:2018-06-11 23:25:27

标签: powerbi dax powerquery m

我很难绕过这个。我正在尝试构建一个路线图,我需要一个起点和一个目的地来实现这一点。我的数据看起来像这样:

+-----------+-----+-----------+
|   Date    | ID  | Location  |
+-----------+-----+-----------+
| 2/7/2018  | 101 | LA        |
| 2/16/2018 | 101 | Seattle   |
| 2/17/2018 | 101 | San Diego |
| 2/26/2018 | 102 | Arlington |
| 3/20/2018 | 101 | Aberdeen  |
| 5/16/2018 | 102 | Mesquite  |
| 5/17/2018 | 102 | Reisor    |
| 6/12/2018 | 103 | Oxnard    |
+-----------+-----+-----------+

我期待的最终结果是:

+-----------+-----+-----------+-------------+
|   Date    | ID  |  Origin   | Destination |
+-----------+-----+-----------+-------------+
| 2/7/2018  | 101 | LA        | Seattle     |
| 2/16/2018 | 101 | Seattle   | San Diego   |
| 2/17/2018 | 101 | San Diego | Aberdeen    |
| 2/26/2018 | 102 | Arlington | Mesquite    |
| 3/20/2018 | 101 | Aberdeen  | Aberdeen    |
| 5/16/2018 | 102 | Mesquite  | Reisor      |
| 5/17/2018 | 102 | Reisor    | Reisor      |
| 6/12/2018 | 103 | Oxnard    | Oxnard      |
+-----------+-----+-----------+-------------+

我在Power Query中尝试了一切可能的方法。我按日期,ID和位置对表进行了排序,然后我创建了表的副本并添加了两个不同的索引(一个从0开始,另一个从1开始),然后我合并了它们。当我将它应用于整个数据集时,它并没有真正解决。我尝试过旋转和解开列。我没有想法。

有人可以建议最好的方法来达到预期效果,无论是在M还是在DAX?

感谢。

1 个答案:

答案 0 :(得分:3)

要解决这个问题,让我们写下规则:

  1. 路线由ID表示。
  2. OriginLocation相同。
  3. 对于Destination,如果它是同一路线上的最后一个日期,则Destination = Origin;否则
  4. Destination将是Location,其中最早/最短的日期晚于同一路线上的当前日期。
  5. 我们所要做的就是将上述规则转换为代码(DAX):

    我们需要知道路线的最后日期(规则3)。在这里,我将其命名为MaxDate

    MaxDate =
    CALCULATE(
        MAX(Route[Date]),
        FILTER(
            Route,
            Route[ID] = EARLIER(Route[ID])
        )
    )
    

    MaxDate

    我们还需要知道同一路线的下一个日期(规则4):

    NextDate =
    CALCULATE(
        MIN(Route[Date]),
        FILTER(
            Route,
            Route[ID] = EARLIER(Route[ID]) &&
            Route[Date] > EARLIER(Route[Date])
        )
    )
    

    NextDate

    现在我们只需要添加逻辑来返回位置:

    Destination = 
    IF(
        Route[Date] = Route[MaxDate],
        Route[Location],
        CALCULATE(
            LASTNONBLANK(Route[Location], ""),
            FILTER(
                Route,
                Route[ID] = EARLIER(Route[ID]) &&
                Route[Date] = EARLIER(Route[NextDate])
            )
        )
    )
    

    Destination

    实际上,您可以使用VAR将其全部包装并删除临时日期列(上述步骤仅用于更好地理解):

    Destination = 
    VAR MaxDate =
    CALCULATE(
        MAX(Route[Date]),
        FILTER(
            Route,
            Route[ID] = EARLIER(Route[ID])
        )
    )
    VAR NextDate =
    CALCULATE(
        MIN(Route[Date]),
        FILTER(
            Route,
            Route[ID] = EARLIER(Route[ID]) &&
            Route[Date] > EARLIER(Route[Date])
        )
    )
    RETURN
    IF(
        Route[Date] = MaxDate,
        Route[Location],
        CALCULATE(
            LASTNONBLANK(Route[Location], ""),
            FILTER(
                Route,
                Route[ID] = EARLIER(Route[ID]) &&
                Route[Date] = NextDate
            )
        )
    )
    

    Final Destination