2017-02-03 100 views
1

假设我有两列:ID日期。我想添加第三列最早的日期。此列应在所有与该行中的ID匹配的数据中查找最早或最小日期。它会生成以下内容 - 请参阅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 

回答

0

如果你不关心ID列的顺序,您还可以使用“所有行”聚合和“日期”列中的最小日期聚合进行分组。建设者应该像下面的图片:

Group by builder

你会得到另一列称为行包含原始表。如果您展开此列以显示日期列,则会得到您想要的表格。

Expand the rows column

+0

如果你想保留原始的每一行,你需要加入它反对原来的桌子。如果您只希望每个日期的最早行,那么这是最好的。 –

+0

谢谢,这个伎俩! –

1

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


在查询这个出发数据称为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 

加入与数据:合并>合并查询(又名“加入”)>合并查询,新建(以避免修改查询1)

选择每次Query1 ID列,并保留默认的左外种联接: Join

接下来,选择Transform> Structured Column> Aggregate,然后选择“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 

Merge1:

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" 
+1

谢谢,可惜我想这一点,但超过200万行数据,2小时后,这仍然没有这样做:( –

0

对于每一行你通过thisrow [ID]滤波源表,然后从所得的表中的[日期]列中选择最小的最早日期。

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