如果下面给出了用户在特定时间戳下采取的操作的示例表:
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”寻找下一个“非滚动”动作并将其包含在返回值中,我似乎无法理解它要做。试图“自我连接”到同一张表,但似乎不太正确。
答案 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%'
);