sql - SQL-在每个用户第 n 次发生事件后返回行
问题描述
我正在使用 postgreSQL 8.0,并且我有一个带有 user_id、timestamp 和 event_id 的表。
如何在每个用户第 4 次出现 event_id = someID 后返回行(或行)?
|---------------------|--------------------|------------------|
| user_id | timestamp | event_id |
|---------------------|--------------------|------------------|
| 1 | 2020-04-02 12:00 | 11 |
|---------------------|--------------------|------------------|
| 2 | 2020-04-02 13:00 | 11 |
|---------------------|--------------------|------------------|
| 2 | 2020-04-02 14:00 | 99 |
|---------------------|--------------------|------------------|
| 2 | 2020-04-02 15:00 | 11 |
|---------------------|--------------------|------------------|
| 2 | 2020-04-02 16:00 | 11 |
|---------------------|--------------------|------------------|
| 2 | 2020-04-02 17:00 | 11 |
|---------------------|--------------------|------------------|
| 2 | 2020-04-02 17:00 | 11 |
|---------------------|--------------------|------------------|
即如果event_id = 11,我只想要上表中的最后一行。
解决方案
您可以使用窗口函数:
select *
from (
select t.*, row_number() over(partition by user_id, event_id order by timestamp) rn
from mytable t
) t
where rn > 4
这是一个从结果中删除行号的小技巧:
select (t).*
from (
select t, row_number() over(partition by user_id, event_id order by timestamp) rn
from mytable t
) x
where rn > 4
推荐阅读
- excel - 在 VBA 中检查浏览器页面是否就绪的最佳方法
- pytorch - 进入要部署的 PyTorchModel 入口点的推理文件对预测器的输出没有影响
- javascript - 如何在不修改数组本身的情况下更改从数组中获取的值?
- python-3.x - 创建列表的 Pythonic 方式
- java - 如何将项目 A 的主要功能调用到项目 B 中?
- python - 我可以做些什么来更正第 11 行中的这个无效语法?
- android - 在 Firebase 控制台项目中添加 Xamarin.Android 应用程序的问题
- javascript - 在 Node.js 中从 SQLite 发送所有数据
- kubernetes - calico 无法 ping 其他使用 calico 网络创建的 POD
- node.js - 帮助我解决 npm 创建第一个项目错误