Если надо вывести пользователей, которые внутри, то задачу можно переформулировать.
Один вариант: последняя запись для пользователя 'enter'. Классическое решение: группировка с последующим join с исходной таблицей, чтобы добраться до агрегируемых полей. Подзапросом определяем последние даты для всех пользователей. Потом по этим датам и пользователям выбираем записи, и среди них оставляем лишь те, которые содержат Action='enter'
SELECT T.HumanId
FROM
(
SELECT ST.HumanId, MAX(ST.Date) AS LastDate
FROM <table> ST
GROUP BY ST.HumanId
) GT
INNER JOIN <table> T
ON GT.HumanId = T.HumanId AND GT.Date = T.Date
WHERE T.Action = 'enter'
У решения есть потенциальная проблема: если MAX(Date) соответствует несколько записей с одинаковой датой, то результат становится непредсказумемым, поскольку среди этих записей могут быть и 'enter' и 'exit', и фактический порядок событий не определить (ссылаться на автоинкрементируемый первичный ключ тоже ненадёжно). Если дата хранится со временем с высокой точностью (допустим, до 100 наносекунд), то вероятность ошибки практически отсутствует, и решение можно считать хорошим.
Другой вариант: известно, что для пользователя "внутри" количество 'enter' = количества 'exit' + 1.
SELECT T1.HumanId
FROM
(
SELECT T1.HumanId, COUNT(T1.Date) AS Enters
FROM <table> T1
WHERE T1.Action = 'enter'
GROUP BY T1.HumanId
) GT1
INNER JOIN
(
SELECT T2.HumanId, COUNT(T2.Date) AS Exits
FROM <table> T2
WHERE T2.Action = 'exit'
GROUP BY T2.HumanId
) GT2
ON GT1.HumanId = GT2.HumanId
WHERE GT1.Enters = GT2.Exits + 1
И у этого решения есть потенциальная проблема: если были обрывы соединений, то в базе будут висеть "вечные" сессии, что приведёт к невозможности использовать этот способ.
Работоспособность не проверял. Не исключено, что второй вариант можно упростить - надо подумать, а некогда.