We had a similar problem and after some help from real pros (Thanks Yoni !) the query turned out to be pretty simple using the top-nested command (see below).
Hope this helps.
let mydata = datatable(TimeGenerated:datetime, SiteName:string, MonitorName:string, Availability:int) // this is just an “inline” table for demonstration purposes
[
datetime(2018-10-05 06:54), "Houston", "Test1", 1,
datetime(2018-10-05 06:44), "Houston", "Test1", 0,
datetime(2018-10-05 06:34), "Houston", "Test1", 1,
datetime(2018-10-05 06:24), "Houston", "Test1", 0,
datetime(2018-10-05 06:14), "Houston", "Test1", 0,
datetime(2018-10-05 06:04), "Houston", "Test1", 0,
datetime(2018-10-05 06:21), "Houston", "Test2", 1,
datetime(2018-10-05 06:11), "Houston", "Test2", 1,
datetime(2018-10-05 06:01), "Houston", "Test2", 1,
datetime(2018-10-05 05:51), "Houston", "Test2", 0,
datetime(2018-10-05 05:41), "Houston", "Test2", 0,
datetime(2018-10-05 06:51), "Houston", "Test3", 0,
datetime(2018-10-05 06:41), "Houston", "Test3", 0,
datetime(2018-10-05 06:31), "Houston", "Test3", 1,
datetime(2018-10-05 06:21), "Houston", "Test3", 0,
datetime(2018-10-05 06:11), "Houston", "Test3", 0,
datetime(2018-10-05 06:38), "Los Angeles", "Test1", 1,
datetime(2018-10-05 06:28), "Los Angeles", "Test1", 0,
datetime(2018-10-05 06:18), "Los Angeles", "Test1", 1,
datetime(2018-10-05 06:08), "Los Angeles", "Test1", 0,
datetime(2018-10-05 06:55), "Los Angeles", "Test2", 0,
datetime(2018-10-05 06:45), "Los Angeles", "Test2", 0,
datetime(2018-10-05 06:35), "Los Angeles", "Test2", 1,
];
let _topCount=3;
mydata
| top-nested of SiteName by max(1), top-nested of MonitorName by max(1), top-nested _topCount of TimeGenerated by max(TimeGenerated), top-nested of Availability by max(1)
| project-away aggregated_MonitorName, aggregated_SiteName, aggregated_TimeGenerated, aggregated_Availability
| order by SiteName asc, MonitorName asc, TimeGenerated desc