电源查询:如果满足条件则查找最短日期
Power query: lookup minimum date if criteria fulfilled
假设我有两列:ID 和 date。我想添加第三列 最早日期 。此列应在与该行中的 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
假设我有两列:ID 和 date。我想添加第三列 最早日期 。此列应在与该行中的 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