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 子行