我有一个名为"metadata"的表,它包含一个由TestId分区的Parameter和ParamterValue列表。每次更改测试时,该测试都将被重新绑定到Azure Data Explorer中,其版本为never。
我的总体目标是:
- 定义一个函数(GetTestsFromSearch(,该函数接受键值对的Parameter(dynamic(,它允许我查询所有测试(最新版本(以查找键值对的匹配:
( {{"Search param1", "Search value1"},{"Search param2", "Search value2"}}
示例
GetTestsFromSearch({{"ProjectId", "SturnProject"},{"Product Name", "Nacelle "}})
应返回
TestId | 版本 |
---|---|
fc76aa10-5cf8-447e-95f6-3bd801ef2ed0 | 3 |
ea5b688c-b61f-4c5b-bb87-af2eac94d454 | 1 |
如果大多数测试都包含相同的属性(如您的示例(,则可以考虑将模式更改为宽模式,其中TestId
和Name
的每次运行(Version
(都是一条记录。结果模式看起来像下面的输出:
**datatable**
| extend pack(Parameter, ParameterValue)
| summarize make_bag(Column1) by TestId, Name, Version
| evaluate bag_unpack(bag_Column1)
然后,您可以设置一个具有以下聚合的物化视图,该聚合将提供您想要的IIUC:
T | summarize arg_max(Version, *) by TestId, Name
要从示例中的模式切换到建议的模式,您可以将接收管道更改为以新的模式格式接收,也可以使用更新策略进行转换。如果选择后者,请避免在更新策略功能中使用bag_unpack插件。相反,要明确地投影所需的列,以避免出现不确定的模式。
另一种选择是将所有属性保留在一个动态列中,结果如下:
**datatable**
| extend pack(Parameter, ParameterValue)
| summarize make_bag(Column1) by TestId, Name, Version
并使用和上面相同的物化视图定义。
对于第一个问题-使用第二个建议的模式,您可以尝试以下内容:
let GetTestsFromSearch = (Filter:dynamic)
{
T
| extend pack(Parameter, ParameterValue)
| summarize Properties = make_bag(Column1) by TestId, Name, Version
| summarize arg_max(Version, *) by TestId, Name
| extend Filter
| mv-apply Filter on
(
extend key=tostring(bag_keys(Filter)[0])
| extend expected = tostring(Filter[key]), actual = tostring(Properties[key])
| summarize count(), countif(actual == expected)
| where count_ == countif_
)
};
GetTestsFromSearch(dynamic({"Test Category" : "Verification safety", "Project name" : "Thor3"}));
测试Id | 名称 | 版本属性 | >count_ | <1th>countif_||
---|---|---|---|---|---|
fc76aa10-5cf8-447e-95f6-3bd801ef2ed0 | ANFRB-FILEVIEW-TEST | 3{ "测试报告,DMS编号"ANFRB3", "测试执行人":"ANFRB3", "项目M管理员":"ANFRB3"> "DVPR、DMS编号":"1234-1234"> "DVRE、DMS编号":"1231-1213"> "测试开始日期":"2022-02-23T00:00:00.0000000000Z"> "测试类别":"验证安全性"> } | 2 | 2 |