电源查询:如果满足条件则查找最短日期

Power query: lookup minimum date if criteria fulfilled

假设我有两列:IDdate。我想添加第三列 最早日期 。此列应在与该行中的 ID 匹配的所有数据中查找最早或最小的 date。它将产生以下内容 - 请参阅 ID 501。我有很多数据,所以需要使用电源查询。公式怎么写?

ID  Date    Earliest Date
501 01/01/2017  01/08/2015
203 08/06/2015  08/06/2015
304 01/04/2014  01/04/2014
501 01/01/2016  01/08/2015
201 01/02/2015  01/02/2015
501 01/08/2015  01/08/2015

解决方案是将原始数据与自身连接,使用最小聚合来计算最早日期。


从名为 Query1 的查询中的起始数据开始:

ID,Date
501,01/01/2017
203,08/06/2015
304,01/04/2014
501,01/01/2016
201,01/02/2015
501,01/08/2015

通过以下方式加入数据:合并 > 合并查询(又名 "Join")> 将查询合并为新的(以避免修改查询 1)

每次选择Query1 ID列,保留默认的Left Outer join Kind:

接下来,选择转换 > 结构化列 > 聚合,然后选择 "Count of Date"(如果 UI 建议最小聚合会更好,但我们可以通过直接触摸代码来解决这个问题) .

接下来,打开公式栏(视图 > 布局 > 公式栏)并编辑公式以将 List.Count 替换为 List.Min。重命名新列,大功告成!


我的完整 "M" 公式:

查询 1:

let
    Source = Table.PromoteHeaders(Csv.Document("ID,Date
501,01/01/2017
203,08/06/2015
304,01/04/2014
501,01/01/2016
201,01/02/2015
501,01/08/2015"))
in
    Source

合并 1:

let
    Source = Table.NestedJoin(Query1,{"ID"},Query1,{"ID"},"NewColumn",JoinKind.LeftOuter),
    #"Aggregated NewColumn" = Table.AggregateTableColumn(Source, "NewColumn", {{"Date", List.Min, "Earliest Date"}})
in
    #"Aggregated NewColumn"

如果您不关心 ID 列的顺序,您还可以使用所有行聚合和日期列中的最小日期聚合对 ID 进行分组。生成器应如下图所示:

您将获得另一个名为“行”的列,其中包含原始 table。如果展开此列以显示日期列,您将获得所需的 table。

通过按此行[ID] 筛选源 table,然后从结果 table.

的 [日期] 列中选择最小值,您可以获得最早的每一行日期
let
    Source = #table(type table[ID=Int64.Type, Date=date], {
    {501,"01/01/2017"},
    {203,"08/06/2015"},
    {304,"01/04/2014"},
    {501,"01/01/2016"},
    {201,"01/02/2015"},
    {501,"01/08/2015"}
    }),
    Convert = Table.TransformColumnTypes(Source,{{"Date", type date}}),

    AddMinDateColumn = Table.AddColumn(Convert, "Earliest Date", (thisrow) => List.Min(Table.SelectRows(Convert, each [ID] = thisrow[ID])[Date]), type date)
in
    AddMinDateColumn