首页 > 解决方案 > 尝试查找总唯一出现次数列并返回该列中的最大值

问题描述

我正在尝试查找每个用户会话的“给用户的消息”事件的发生次数,并返回每个用户的最大会话数。所以这意味着我想跟踪有多少用户会话有“给用户的消息”事件,但如果这有意义的话,我想消除在同一个会话中发生的重复项?

我也在寻找所有用户的总用户会话

我试图找到这些值没有成功。我的桌子看起来像这样:

user_id | event                      | user_session_id

1       | message to user            | 1
1       | message to user            | 1
1       | message from user          | 1
1       | message to user            | 1
1       | message from user          | 2 
1       | message to user            | 2  
1       | message to user            | 3
2       | message to user            | 1
2       | message to user            | 1
2       | message from user          | 1
2       | message to user            | 1
2       | message from user          | 2 
2       | message to user            | 2  

我的预期输出将是这样的:

user_id | event                      | user_session_id | max_session_by_user | total_sessions 
1       | message to user            | 1               | 3                   | 5
1       | message to user            | 2               | 3                   | 5
1       | message to user            | 3               | 3                   | 5
2       | message to user            | 1               | 2                   | 5
2       | message to user            | 2               | 2                   | 5

谢谢

编辑:我添加了更多关于我在寻找事件列时的意思的说明

标签: sqlpostgresqlpostgresql-9.6

解决方案


首先过滤所需的事件并消除重复项。

然后使用窗口函数添加计数。

SELECT user_id, event, user_session_id,
       count(*) OVER (PARTITION BY user_id) AS max_session_by_user,
       count(*) OVER () AS total_sessions
FROM (SELECT DISTINCT user_id, event, user_session_id
      FROM events_table
      WHERE event = 'message to user') AS q;

推荐阅读