根据 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 中实现预期结果的最佳方法吗?
谢谢。
为了解决这个问题,让我们写下规则:
- 路线由
ID
表示。
Origin
等同于 Location
.
- 对于
Destination
,如果是同一路线的最后日期,则Destination
= Origin
;否则
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
)
)
)
我很难理解这个问题。我正在尝试构建路线图,我需要一个起点和一个终点来实现这一目标。我的数据看起来像这样:
+-----------+-----+-----------+
| 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 中实现预期结果的最佳方法吗?
谢谢。
为了解决这个问题,让我们写下规则:
- 路线由
ID
表示。 Origin
等同于Location
.- 对于
Destination
,如果是同一路线的最后日期,则Destination
=Origin
;否则 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
)
)
)