Вы можете использовать аналитическую функцию COUNT
, которая не потребует от вас самостоятельного объединения на вашем столе.
Установка Oracle :
CREATE TABLE USER_EVENTS ( ID, EVENT_TYPE, EVENT_DATE, USER_ID ) AS
SELECT 1, 'USER_DELETED', DATE '2019-01-10', 5301 FROM DUAL UNION ALL
SELECT 2, 'USER_ACTIVATED', DATE '2019-01-09', 5301 FROM DUAL UNION ALL
SELECT 3, 'USER_DELETED', DATE '2019-01-05', 5302 FROM DUAL UNION ALL
SELECT 4, 'USER_ACTIVATED', DATE '2019-01-11', 5302 FROM DUAL UNION ALL
SELECT 5, 'USER_DELETED', DATE '2019-01-01', 5288 FROM DUAL UNION ALL
SELECT 6, 'USER_DELETED', DATE '2019-01-02', 5287 FROM DUAL UNION ALL
SELECT 7, 'USER_CREATED', DATE '2018-12-01', 5211 FROM DUAL UNION ALL
SELECT 8, 'USER_NOTE', DATE '2018-12-01', 5211 FROM DUAL;
Запрос 1 :
SELECT *
FROM (
SELECT u.*,
COUNT( CASE event_type WHEN 'USER_ACTIVATED' THEN 1 END )
OVER (
PARTITION BY user_id
ORDER BY event_date
ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING
) AS num_activated
FROM USER_EVENTS u
)
WHERE num_activated > 0
AND event_type = 'USER_DELETED';
Результаты
ID | EVENT_TYPE | EVENT_DATE | USER_ID | NUM_ACTIVATED
-: | :----------- | :--------- | ------: | ------------:
3 | USER_DELETED | 05-JAN-19 | 5302 | 1
Запрос 2 :
Если вы просто хотите задействовать USER_ID
s, тогда вы можете использовать GROUP BY
и HAVING
:
SELECT USER_ID
FROM USER_EVENTS
GROUP BY USER_ID
HAVING MIN( CASE EVENT_TYPE WHEN 'USER_DELETED' THEN EVENT_DATE END )
< MIN( CASE EVENT_TYPE WHEN 'USER_ACTIVATED' THEN EVENT_DATE END )
Результаты :
| USER_ID |
| ------: |
| 5302 |
дБ <> скрипка здесь