Почему бы не использовать могучий LEAD / LAG?
SELECT * FROM (
SELECT id,
event_type,
event_date,
user_id,
CASE
WHEN event_type = 'USER_DELETED' THEN LEAD(EVENT_DATE) OVER (PARTITION BY useR_id ORDER BY event_type DESC)
ELSE NULL
END AS CREATED
FROM user_events
WHERE event_type IN ('USER_ACTIVATED','USER_DELETED')
)
WHERE created > event_date
В Перечислениях C# встраиваются, чтобы быть константами compilier так или иначе, таким образом, преимущество является четкостью кода
Вещь быть осторожным относительно того, когда использование Перечислений не должно использовать ни одну из операций, которые требуют отражения (или используют их с осторожностью). Например:
В случае констант опция выполнения любых операций, которые требуют, не существует отражение. Однако в случае перечислений это делает. Таким образом, необходимо будет быть осторожными с этим.
Я видел отчеты о профиле, где операции, касающиеся перечислимых проверок/, отражения взяли до 5% процессорного времени (сценарий, где перечислимые проверки были сделаны на каждом вызове к методу API). Это может быть значительно уменьшено путем записи класса, который кэширует результаты отражения перечислимых используемых типов.
Однако я рекомендовал бы принять решение об использовании перечисления по сравнению с константой на основе того, что имеет смысл с точки зрения дизайна. Это при проверке, что команда знает о последствиях производительности операций, включающих отражение.
Кроме того, я не уверен, что Вы должны быть взволнованы по поводу этого вообще. Это действительно походит на преждевременную оптимизацию. Я уверен что в любой системе, существуют большие узкие места, чем перечислимые сравнения.:)