根据条件在PowerQuery的列数据中放入标识符

时间:2018-11-29 11:39:07

标签: excel powerquery

我想知道如何在幂查询中为值添加唯一标识符。我不确定我的解释是否正确,但故事是这样的。 在正常的excel过程中,我将按其值对列进行排序,因此,如果存在多个具有相同值的单元格,则它将在第一个实例中放置一个标识符。例如,我们的数据如下:

OK

我先排序,然后在B列中使用以下公式:

+---------------+
|       A       |
+---------------+
| Column Header |
| 5             |
| 5             |
| 6             |
| 7             |
| 7             |
+---------------+

这将导致

=if(A2=A1;"";"Unique") 

在这里,我可以使用“ Unique”或任何字符串作为标识符,但是我只想知道如何在超级查询中执行相同的操作。我会很感激的。 BR

+---------------+--------+ | A | B | +---------------+--------+ | Column Header | | | 5 | Unique | | 5 | | | 6 | Unique | | 7 | Unique | | 7 | | +---------------+--------+ 列具有我要在第一个实例中放置唯一标识符的值:

Div/Mat col has the value that i want to put unique identifier in first instance

3 个答案:

答案 0 :(得分:0)

假设您已经对表进行了相应的排序,请首先添加索引列:

#"Added Index" = Table.AddIndexColumn(PriorStep, "Index", 0, 1),

然后,您可以添加一个自定义列,根据索引值将每一行与上一行进行比较:

#"Added Unique" = Table.AddColumn(#"Added Index", "Unique", each if [Index] = 0 then "Unique" else if #"Added Index"{[Index]}[Header] <> #"Added Index"{[Index] - 1}[Header] then "Unique" else null),

最后,删除“索引”列:

#"Removed Columns" = Table.RemoveColumns(#"Added Unique",{"Index"})

或者:您可能希望在未排序的表中找到值的第一个匹配项-这种方法可以做到这一点(当然,对排序表仍然有效):

#"Added Index" = Table.AddIndexColumn(PriorStep, "Index", 0, 1),
#"Grouped Rows" = Table.Group(#"Added Index", {"Header"}, {{"MinIndex", each List.Min([Index]), type number}}),
#"Merged Queries" = Table.NestedJoin(#"Added Index",{"Header", "Index"},#"Grouped Rows",{"Header", "MinIndex"},"Group",JoinKind.LeftOuter),
#"Added First Occurrence" = Table.AddColumn(#"Merged Queries", "First Occurrence", each if Table.IsEmpty([Group]) then null else "First"),
#"Removed Columns" = Table.RemoveColumns(#"Added First Occurrence",{"Index", "Group"})

答案 1 :(得分:0)

这是另一种方式:

我按照您所描述的那样带入表格,对其进行排序,分组,然后使用List.ReplaceRange将每个分组的第一项更改为“唯一”。然后,将列表扩展到新行。它给了我这个:

enter image description here

然后我删除AllData列:

enter image description here

代码如下:

let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", Int64.Type}}),
#"Sorted Rows" = Table.Sort(#"Changed Type",{{"Column1", Order.Ascending}}),
#"Grouped Rows" = Table.Group(#"Sorted Rows", {"Column1"}, {{"AllData", each _, type table}}),
#"Added Custom" = Table.AddColumn(#"Grouped Rows", "Custom", each List.ReplaceRange([AllData][Column1],0,1,{"Unique"})),
#"Expanded Custom" = Table.ExpandListColumn(#"Added Custom", "Custom"),
#"Removed Columns" = Table.RemoveColumns(#"Expanded Custom",{"AllData"})
in
#"Removed Columns"

答案 2 :(得分:0)

另一种解决方案,也许更容易,而且您不必对值进行排序。

请参见下面的代码和注释。

let
Source = Table.FromColumns({{5,5,6,7,6}},{"Values"}),

//一个示例表,请改用Excel表。

WithIndex = Table.AddIndexColumn(Source, "Index"),

//向“源”表中添加“索引”列。

NewUniqueColumn = Table.AddColumn(WithIndex, "Is_Unique", each List.PositionOf(WithIndex[Values],[Values]) = [Index])

//向具有“真”或“假”值的名为“ Is_Unique”的“ WithIndex”表中添加新列。

//第三个参数是应用于每行的公式:

// WithIndex [Values]从“值”列返回一个列表。

// [Value]是该行的值。

// List.PositionOf(WithIndex [Values],[Values])返回值(从该行开始)在值列表中的首次出现位置。

//然后,它根据[index](此行的索引列的值)检查结果,并返回布尔值(true或false)

in

NewUniqueColumn

您可以复制并粘贴以下代码以查看其工作方式:

let
Source = Table.FromColumns({{5,5,6,7,6}},{"Values"}),
WithIndex = Table.AddIndexColumn(Source, "Index"),
NewUniqueColumn = Table.AddColumn(WithIndex, "Is_Unique", each List.PositionOf(WithIndex[Values],[Values]) = [Index])
in
NewUniqueColumn

现在,您可以删除索引列,并根据需要更改“ True / False”值。

希望有帮助。