以下是儿童日常活动的示例。我想根据用户 ID 选择最后一个“播放”活动之后的下一行。
id timestamp activity
567 1541300537817000 Play
567 1541300584959000 Games
567 1541300711884001 Play
567 1541300749548000 Study
567 1541300804865000 Movie
678 1542073550481000 Computer
678 1542073551422000 Play
678 1542073551478000 Play
678 1542073561885000 Play
678 1542073567663000 Sleep
908 1543580126943000 Tv
908 1543580212409000 Sleep
908 1543580245227000 Play
Expected output
id timestamp activity
567 1541300749548000 Study
567 1541300804865000 Movie
678 1542073567663000 Sleep
我试过这样做:
SELECT DISTINCT t1.*
FROM `table` t1, `table` t2
WHERE t1.id = t2.id
AND t1.timestamp > t2.timestamp
AND t2.activity = 'Play';
但它在第一次播放活动后给了我活动。
可以通过再添加一个表格副本来检查之后是否没有“播放”活动来解决。
但最好使用子查询来选择最后一个“播放”活动,并获取它之后的所有记录:
搜索如何在不影响性能的情况下完成第一部分。在执行第二部分时,将它与适当的索引一起使用,并且可能与使用触发器或作业创建的临时表一起使用。例如,一项工作可以用任务 1. 每晚的结果更新一个小得多的表。
您的示例数据表明您希望所有活动都在 last
PLAY
per之后ID
。一种方法是稍后要求所有不存在戏剧的活动: