SQL:按组选择行,直到满足条件为止

时间:2018-11-01 00:22:33

标签: mysql 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

所以这对于第一个“ id”是正确的,但是我需要它然后为下一个“ id”寻找下一个“非滚动”动作并将其包含在返回值中,我似乎无法理解它要做。试图“自我连接”到同一张表,但似乎不太正确。

1 个答案:

答案 0 :(得分:0)

您可以使用相关子查询:

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