The logic seems to have some contradictions. Why? Because you're looking for InProgress runs with a status of Succeeded, Failed or Cancelled.This doesn't make sense because a run cannot simultaneously have both InProgress and one of the other statuses. This might explain the unexpected results you're seeing.
Consider simplifying the query. If you're trying to get alerts for jobs that are in progress for more than 4 hours, you can use:
ADFPipelineRun
| where Status == "InProgress"
| where datetime_diff('minute', now(), Start) > 240