Я думаю, что стандартный ROW_NUMBER
запрос должен работать здесь:
WITH cte AS (
SELECT t.*, ROW_NUMBER() OVER (PARTITION BY t.ID ORDER BY t.DATE DESC) rn
FROM yourTable
WHERE SRC = 3
)
SELECT ID, USER
FROM cte
WHERE rn = 1;

Демо
Причина, по которой это работает, заключается в том, что значения NULL
сортируются последними в порядке возрастания или сначала в порядке убывания. Так как номер строки выше сортируется по убыванию по дате, это означает, что NULL
даты, если они присутствуют, будут отсортированы первыми, в противном случае более новая дата будет появляться первой.