我很难绕过这个。我正在尝试构建一个路线图,我需要一个起点和一个目的地来实现这一点。我的数据看起来像这样:
+-----------+-----+-----------+
| 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?
感谢。
答案 0 :(得分:3)
要解决这个问题,让我们写下规则:
ID
表示。Origin
与Location
相同。Destination
,如果它是同一路线上的最后一个日期,则Destination
= Origin
;否则Destination
将是Location
,其中最早/最短的日期晚于同一路线上的当前日期。我们所要做的就是将上述规则转换为代码(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])
)
)
现在我们只需要添加逻辑来返回位置:
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
)
)
)