Если дана приведенная ниже примерная таблица действий, предпринятых пользователями в определенные временные метки:
id | ts | action
---+-----------+------
1 | 10039000 | scroll_10
1 | 10039002 | scroll_20
1 | 10039004 | click
1 | 10039006 | scroll_30
2 | 10044000 | scroll_10
2 | 10044002 | bounce
Мне нужно получить результаты до первого действия non-scroll для каждого ID.
Если есть дополнительные scroll actions для каждого пользователя, которые появляются на timestamps после первого действия non-scroll, их не следует извлекать.
Ожидаемый результат для приведенного выше примера:
id | action
---+-------
1 | scroll_10
1 | scroll_20
2 | scroll_10
Я попробовал следующий запрос:
SELECT id, action
FROM user_actions
WHERE ts < (SELECT MIN(ts)
FROM user_actions
WHERE action NOT LIKE '%scroll%'
)
Что дает мне результат:
id | action
---+-------
1 | scroll_10
1 | scroll_20
Итак, это правильно для первого идентификатора, но мне нужно, чтобы он затем искал следующее действие без прокрутки для следующего идентификатора и включал его в ответ, чего я, похоже, не могу заставить . Пытался «самосоединиться» с той же таблицей, но не совсем понял синтаксис.
@ D-Shih Это для MySQL
Добро пожаловать в Stackoverflow. Лучше всего, если вы покажете, какой SQL вы пробовали и какие результаты были получены.






Вы можете использовать коррелированный подзапрос:
select t.*
from t
where t.timestamp < (select min(t2.timestamp)
from t t2
where t2.id = t.id and t2.action not like 'scroll%'
);
Большое спасибо!! У меня возникли проблемы с точным синтаксисом коррелированного подзапроса, он отлично работает.
Какая у вас база данных?