检查每个组的列中是否存在值

Ell*_*ner 5 sql postgresql

我很难将我想要做的事情转化为文字,所以搜索也很困难.

基本上我试图查看列中是否存在某个值,按组分区,然后向前传播该值.

在这个例子中,我想检查用户是否已经完成了教程并设置了一个前进的标志.

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)

Mic*_*ael 5

我不确定这个速度,但是下面的解决方案怎么样?

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)


Ain*_*r-G 4

您可以使用子句过滤 SQLHAVING。例如,您可以按用户及其活动对表进行分组,然后对其进行过滤以仅包含已完成教程的用户:

\n\n
SELECT user FROM tbl\nGROUP BY user, activity\nHAVING activity = \'completed_tutorial\';\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑: OP 编辑​​了他们的问题后,这是我的新答案。在这里,我假设您的表有一个日期字段。

\n\n
SELECT *, 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\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,在未优化时,此类查询本质上是 N\xc2\xb2,因此我建议只从数据库获取数据,然后在程序中对其进行处理。

\n