我有以下数据库方案,其中收集了所有用户操作:

user_action
===============================

user_id action_id timestamp
===============================
1       1         2022/05/07 17:23
1       2         2022/05/07 17:24
1       1         2022/05/07 17:25
2       1         2022/05/07 17:23
2       2         2022/05/07 17:24
3       2         2022/05/07 17:23
3       1         2022/05/07 17:24


action
===============================

id    name
===============================
1     blocked
2     unblocked

目标是找到所有最近被屏蔽的用户.因此,预期的结果是找到13个用户ID,因为这些用户最近被阻止了.

我试着使用下面的SQL,但仍然没有很好的理解如何完成这一点:

select user_id, action_id, max(timestamp) as timestamp 
from user_action 
where action_id in (1,2) 
group by user_id, action_id

当前查询只能返回以下内容:

===============================
user_id action_id timestamp
1       2         2022/05/07 17:24
1       1         2022/05/07 17:25
2       1         2022/05/07 17:23
2       2         2022/05/07 17:24
3       2         2022/05/07 17:23
3       1         2022/05/07 17:24

对于上面的结果,我需要告诉所有用户,其中action_id=1,timestamp大于action_id=2

推荐答案

一种解决方案是在嵌入式查询中使用ROW_NUMBER,然后过滤最后timestamp和所需action_id的结果.

SELECT ua.user_id, ua.action_id, ua.timestamp
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY timestamp DESC) rn
      FROM user_action) ua
WHERE ua.rn = 1 AND ua.action_id = 1

Sql相关问答推荐

将SEMI JOIN、ANTI JOIN转换为非连接SQL

SQL JOIN of 2 Table with 2 sum

使用交叉应用透视表在SQL中转换分段时间段&

MariaDB查询在逗号分隔的字符串中查找多个值

连接三个表的正确方式是什么?在这三个表中,可以显示在一个表上的行将在其他表中显示结果

雅典娜嵌套Json提取液

过go 四周未填充的数据,即W50,51,52-SQL

在SQL中为两个日期之间的每个日期添加行

将两列相加为同一表中的行的查询

我如何才能在付款人单列中拉出只有9个付款人单的人?

同一表的Oracle SQL更新(含YTD合计)

需要使用SQLite查询进行一些奇怪的时间转换

查询以从时间范围列表中查找唯一时间段

Select 一个非零值减少重复

DB2 SQL查询结果多余数据

对于小数据集,EF / SQL 语句花费的时间太长

BigQuery导航函数计算ID

如何根据与 BigQuery 中另一个表的匹配更新一个表中的列?

T-SQL - 返回每条记录的最近雇佣日期

Snowflake SQL group-by 的行为不同,具体取决于列是按位置引用还是按别名引用