SQL: выбор строк по группе, пока не будет выполнено условие - PullRequest
0 голосов
/ 01 ноября 2018

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

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

Так что это правильно для первого «идентификатора», но мне нужно, чтобы он затем искал следующее действие «без прокрутки» для следующего «идентификатора» и включил его в возвращение, которое я не могу получить это делать. Пытался «самостоятельно присоединиться» к той же таблице, но, похоже, синтаксис не может быть корректным.

1 Ответ

0 голосов
/ 01 ноября 2018

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

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%'
                    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...