根据 Location 列和 Date 找出 Origin 和 Destination

Figure out Origin and Destination based on Location column and Date

我很难理解这个问题。我正在尝试构建路线图,我需要一个起点和一个终点来实现这一目标。我的数据看起来像这样:

+-----------+-----+-----------+
|   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 和位置对 table 进行了排序,然后创建了 table 的副本并添加了两个不同的索引(一个从 0 开始,另一个从 1 开始),然后我'我们合并了他们。当我将它应用于整个数据集时,它并没有真正奏效。我试过旋转和取消旋转列。我没主意了。

有人可以建议在 M 或 DAX 中实现预期结果的最佳方法吗?

谢谢。

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

  1. 路线由ID表示。
  2. Origin 等同于 Location.
  3. 对于Destination,如果是同一路线的最后日期,则Destination = Origin;否则
  4. Destination 将是 Location,其中 earliest/minimum 日期晚于同一路线上的当前日期。

我们所要做的就是将上述规则转化为代码(DAX):

我们需要知道路线的最后日期(适用于规则 3)。这里我命名为MaxDate:

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

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

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

现在我们只需要将逻辑添加到return位置:

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

实际上,您可以使用 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
        )
    )
)