【问题标题】:Figure out Origin and Destination based on Location column and Date根据位置列和日期找出出发地和目的地
【发布时间】:2018-06-11 23:25:27
【问题描述】:

我很难理解这一点。我正在尝试构建路线图,我需要一个起点和一个目的地来实现这一点。我的数据如下所示:

+-----------+-----+-----------+
|   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 中?

谢谢。

【问题讨论】:

    标签: powerbi dax powerquery m


    【解决方案1】:

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

    1. 路由由ID表示。
    2. OriginLocation 相同。
    3. 对于Destination,如果是同一条路线的最后一天,那么Destination = Origin;否则
    4. 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
            )
        )
    )
    

    【讨论】:

    • @Foxan Ng 感谢您提供如此令人难以置信的答案和课程。感谢您的帮助!这确实解决了我的问题。
    • @iCosmin 很高兴为您提供帮助!刚刚意识到MaxDate 不是必须的,我们可以检查NextDate 是否为空并达到相同的结果。我会留给你的:)
    • 再次感谢@Foxan Ng。我会保留 MaxDate,因为我认为它很有用,以防我将来需要验证。
    猜你喜欢
    • 2019-06-13
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 2023-03-04
    相关资源
    最近更新 更多