我很难将我想要做的事情转化为文字,所以搜索也很困难.
基本上我试图查看列中是否存在某个值,按组分区,然后向前传播该值.
在这个例子中,我想检查用户是否已经完成了教程并设置了一个前进的标志.
pk | user | ... | activity
1 | A | ... | "login"
2 | A | ... | "started_tutorial"
3 | A | ... | "completed_tutorial"
4 | A | ... | "some other activity"
5 | A | ... | "logout"
5 | B | ... | "login"
6 | B | ... | "logout"
Run Code Online (Sandbox Code Playgroud)
我认为这应该是这样的
select *,
check(activity in ('completed_tutorial')) as completed_activity
from tbl
Run Code Online (Sandbox Code Playgroud)
但我不认为我可以check在select语句中使用,这将是一个常量标志,而不是只有在找到后才设置为true.
我想要得到的例子:
pk | user | ... | activity | completed_tutorial
1 | A | ... | "login" | 0
2 | A | ... | "started_tutorial" | 0
3 | A | ... | "completed_tutorial" | 1
4 | A | ... | "some other activity" | 1
5 | A | ... | "logout" | 1
5 | B | ... | "login" | 0
6 | B | ... | "logout" | 0
Run Code Online (Sandbox Code Playgroud)
我不确定这个速度,但是下面的解决方案怎么样?
SELECT
user
,max(CASE
WHEN activity = "completed_tutorial" THEN 1
ELSE 0
END) AS completed_tutorial
FROM tbl
GROUP BY user
;
Run Code Online (Sandbox Code Playgroud)
您可以使用子句过滤 SQLHAVING组。例如,您可以按用户及其活动对表进行分组,然后对其进行过滤以仅包含已完成教程的用户:
SELECT user FROM tbl\nGROUP BY user, activity\nHAVING activity = \'completed_tutorial\';\nRun Code Online (Sandbox Code Playgroud)\n\n编辑: OP 编辑了他们的问题后,这是我的新答案。在这里,我假设您的表有一个日期字段。
\n\nSELECT *, COALESCE(date >= (\n SELECT date FROM tbl WHERE activity = \'completed_tutorial\'\n AND user = outertbl.user\n), FALSE)\nFROM tbl AS outertbl\nORDER BY date\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,在未优化时,此类查询本质上是 N\xc2\xb2,因此我建议只从数据库获取数据,然后在程序中对其进行处理。
\n