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
)
- sturlaws7 years agoResident Rockstar
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-queryAssetts = 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))