Forum Discussion
Calculating remediated vulnerabilities
- 7 years ago
hi tvm_analyst
you could try something like this:new table = ADDCOLUMNS ( SUMMARIZE ( 'finding_date', 'finding_date'[asset_id], 'finding_date'[vulnerability_id] ), "firstFoundDate", CALCULATE ( MIN ( 'finding_date'[date] ) ),
"lastFoundDate", CALCULATE ( Max ( 'finding_date'[date] ) ) )then, assuming that asset_id and vulnerability_id is unique in the finding-table, create a new column in the new table
isSolvedFlag = IF ( ISBLANK ( LOOKUPVALUE ( 'finding'[date], 'finding'[asset_id], 'new table'[asset_id], 'finding'[vulnerability_id], 'new table'[vulnerability_id] ) ), 1, 0 )and then you should be on you way
One last question. How would I write a null/BLANK() for remediation_date for unique_keys that are present in the finding table. Here's what I've got so far...
summarized_finding_date =
ADDCOLUMNS(
SUMMARIZE(
'public fact_asset_vulnerability_finding_date',
'public fact_asset_vulnerability_finding_date'[asset_id],
'public fact_asset_vulnerability_finding_date'[vulnerability_id],
'public dim_vulnerability'[sla_target],
'public fact_asset_vulnerability_finding_date'[unique_key]
),
"first_found_date", FIRSTDATE('public fact_asset_vulnerability_finding_date'[day]),
"remediation_date", LASTDATE('public fact_asset_vulnerability_finding_date'[day]) + 1
)
How about first creating a column in the finding-table to identify unique ids which are not present in finding_date-table:
DetectedFlag =
IF (
COUNTROWS (
FILTER (
fact_asset_vulnerability_finding_date;
fact_asset_vulnerability_finding_date[unique_key]
= CALCULATE ( VALUES ( fact_asset_vulnerability_finding[unique_key] ) )
)
) >= 1;
0;
1
)
then use this flag, together with a union query to add these rows to the Assets-table-query
Assetts =
union(
ADDCOLUMNS(
SUMMARIZE(
fact_asset_vulnerability_finding_date;
fact_asset_vulnerability_finding_date[asset_id];
fact_asset_vulnerability_finding_date[vulnerability_id];
fact_asset_vulnerability_finding_date[unique_key]
);
"First found date";CALCULATE(min(fact_asset_vulnerability_finding_date[first_found_date]));
"Last date written";CALCULATE(max(fact_asset_vulnerability_finding_date[date_written])))
;
ADDCOLUMNS(
SUMMARIZE(
FILTER(fact_asset_vulnerability_finding;fact_asset_vulnerability_finding[DetectedFlag]=1);
fact_asset_vulnerability_finding[asset_id];
fact_asset_vulnerability_finding[vulnerability_id];
fact_asset_vulnerability_finding[unique_key]
);
"First found date";CALCULATE(min(fact_asset_vulnerability_finding[first_found_date]));
"Last date written";BLANK()))Alternatively, you can try to do this in power query during the import of the data
- tvm_analyst7 years agoFrequent Visitor
Thank you very much for your help sturlaws ! I ended up adding a column to the finding_date table for a status of open/closed and using this for the summarized table. Open items still get a remediation date, but they are jsut filtered out later. Thanks again.
summarized_finding_date = ADDCOLUMNS( SUMMARIZE( 'public fact_asset_vulnerability_finding_date', 'public fact_asset_vulnerability_finding_date'[asset_id], 'public dim_asset'[credential_status], 'public dim_asset'[host_name], 'public dim_vulnerability'[risk_score], tag_owner[public dim_tag.name], 'public fact_asset_vulnerability_finding_date'[vulnerability_id], 'public dim_vulnerability'[sla_target], 'public dim_vulnerability'[dlx_severity], dlx_cat_class[lookups.Classification], dlx_cat_parent[lookups.Parent Technology], 'public fact_asset_vulnerability_finding_date'[open], 'public fact_asset_vulnerability_finding_date'[unique_key]), "first_found_date", CALCULATE(MIN('public fact_asset_vulnerability_finding_date'[day])), "remediation_date", CALCULATE(MAX('public fact_asset_vulnerability_finding_date'[day]) +1))