PowerQuery - 主行和子行 - 基于公式或逻辑的另一行的参考值

Posted

技术标签:

【中文标题】PowerQuery - 主行和子行 - 基于公式或逻辑的另一行的参考值【英文标题】:PowerQuery - Master & Sub Rows - Reference Values of Another Row Based on Formula or Logic 【发布时间】:2021-12-10 19:11:28 【问题描述】:

我正在分析 Excel 中的漏洞扫描程序导出数据,并使用一些强大的查询从中开发票证。我已经将数据转换成一种格式,可以让我分析和确定哪些已经有票,哪些没有。对于那些不这样做的人,他们可能已经创建了主票,但有些可能没有。在我的分析过程中,我将确定是否需要创建票证,并且其输出应包括将其链接到的主票证编号(如果已创建),或者如果尚未创建主票证,则使用也将被创建的主工单的索引号。

我开始使用的一些示例数据是:

CVE Description Team Locations Master Matching Ticket Create Ticket
CVE-2021-12345 Vuln Description 1 True Tic-1234 No
CVE-2021-12345 Vuln Description 1 Ops 1, 2, 3 Yes
CVE-2021-12345 Vuln Description 1 Dev 4, 5, 6 Yes
CVE-2021-12345 Vuln Description 1 InfoSec 7, 8, 9 Yes
CVE-2021-67891 Vuln Description 2 True Yes
CVE-2021-67891 Vuln Description 2 Dev 4, 5, 6 Yes
CVE-2021-23456 Vuln Description 3 True Tic-4567 No
CVE-2021-23456 Vuln Description 3 InfoSec 7, 8, 9 Yes
CVE-2021-23456 Vuln Description 3 Ops 1, 2, 3 Yes
CVE-2021-78912 Vuln Description 4 True Yes
CVE-2021-78912 Vuln Description 4 Dev 4, 5, 6 Yes
CVE-2021-78912 Vuln Description 4 Ops 4, 5, 6 Yes
CVE-2021-78912 Vuln Description 4 InfoSec 4, 5, 6 Yes

我可以理解使用 excel 公式获得匹配的逻辑,如:If create ticket equals yes, then (if master does not equal true, then (if the lookup for the matching CVE that has master equals true and has a value in matching ticket, then return the value in matching ticket column, else (if master does not equal true, then (if the lookup for the matching CVE that has master equals true, and does not have a value in matching ticket, then result the value of an index number, else leave blank), else leave blank), else leave blank), else leave blank).

但是,我正在尝试通过电源查询使此操作更具可重复性,但我无法找到正确的函数。从这个现有的数据集中,我将使用 Power Query 创建一个新的查询/表,并过滤所有在 create ticket 列中没有 yes 的行,并添加一个索引行。从那里我想专门为此链接逻辑添加一个新列,但我似乎无法正确理解逻辑。我知道我可以在这些列中使用 if then 逻辑,但是根据匹配值从另一行获取数据是我遇到的问题。

我实际上正在寻找的输出是:

CVE Description Team Locations Master Create Ticket Index Linked Ticket
CVE-2021-12345 Vuln Description 1 Ops 1, 2, 3 Yes 1 Tic-1234
CVE-2021-12345 Vuln Description 1 Dev 4, 5, 6 Yes 2 Tic-1234
CVE-2021-12345 Vuln Description 1 InfoSec 7, 8, 9 Yes 3 Tic-1234
CVE-2021-67891 Vuln Description 2 True Yes 4
CVE-2021-67891 Vuln Description 2 Dev 4, 5, 6 Yes 5 4
CVE-2021-23456 Vuln Description 3 InfoSec 7, 8, 9 Yes 6 Tic-4567
CVE-2021-23456 Vuln Description 3 Ops 1, 2, 3 Yes 7 Tic-4567
CVE-2021-78912 Vuln Description 4 True Yes 8
CVE-2021-78912 Vuln Description 4 Dev 4, 5, 6 Yes 9 8
CVE-2021-78912 Vuln Description 4 Ops 4, 5, 6 Yes 10 8
CVE-2021-78912 Vuln Description 4 InfoSec 4, 5, 6 Yes 11 8

感谢任何帮助。

【问题讨论】:

请解释为什么 Vuln4 Ops 和 InfoSec 在输出中都重复两次,而 Vuln2 Dev 在输出中只出现一次。还有为什么最后两个输出行的索引列是Yes 感谢您的关注。我修好了它。那是表格内容中的错误。我花了大约 30 分钟才能发帖,因为堆栈溢出不断给出错误,即有代码,但没有。错误添加的行可能最终出现在我正在尝试解决问题以允许我发布的一些复制/粘贴中。 【参考方案1】:

基本上就是过滤合并

Filter Master = True,将其与原始表合并并展开匹配票证

过滤创建工单 = 是

添加索引

Filter Master = True,将其与此步骤之前的数据合并并展开索引

执行 if/then 语句来确定 null、ticket 或 index

let Source = Excel.CurrentWorkbook()[Name="Table2"][Content],
#"Merged Queries" = Table.NestedJoin(Source,"CVE",Table.SelectRows(Source, each ([Master] = true)),"CVE","Table2",JoinKind.LeftOuter),
#"Expanded Table2" = Table.ExpandTableColumn(#"Merged Queries", "Table2", "Matching Ticket", "zLinked Ticket"),
#"Filtered Rows" = Table.SelectRows(#"Expanded Table2", each ([Create Ticket] = "Yes")),
#"Added Index" = Table.AddIndexColumn(#"Filtered Rows", "Index", 1, 1),
#"Merged Queries1" = Table.NestedJoin(#"Added Index","CVE",Table.SelectRows(#"Added Index", each ([Master] = true)),"CVE","Table2",JoinKind.LeftOuter),
#"Expanded Table1" = Table.ExpandTableColumn(#"Merged Queries1", "Table2", "Index", "Index.1"),
#"Added Custom" = Table.AddColumn(#"Expanded Table1", "Custom", each if [Master]=null and [zLinked Ticket]=null then [Index.1] else if [Master]=null then [zLinked Ticket] else null),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom","zLinked Ticket", "Index.1")
in #"Removed Columns"

【讨论】:

这对你有用吗?

以上是关于PowerQuery - 主行和子行 - 基于公式或逻辑的另一行的参考值的主要内容,如果未能解决你的问题,请参考以下文章

具有 Vue 语法的 jQuery DataTables 子行

jQuery tablesorter 仅对子行分组小计

HTML:如何使用 AngularJs 填充第一行是父行和后续行是子行的行

●oracle——层次化查询

powerquery的sum公式

Powerquery M 公式中的标记文字