SQL: выбирайте строки по группе, пока не будет выполнено условие

Если дана приведенная ниже примерная таблица действий, предпринятых пользователями в определенные временные метки:

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 01.11.2018 01:50

@ D-Shih Это для MySQL

Ananth Varma 01.11.2018 01:58

Добро пожаловать в Stackoverflow. Лучше всего, если вы покажете, какой SQL вы пробовали и какие результаты были получены.

bcperth 01.11.2018 02:03
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
3
776
1

Ответы 1

Вы можете использовать коррелированный подзапрос:

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%'
                    );

Большое спасибо!! У меня возникли проблемы с точным синтаксисом коррелированного подзапроса, он отлично работает.

Ananth Varma 01.11.2018 03:09

Другие вопросы по теме