首页 > 解决方案 > 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,我只想要上表中的最后一行。

标签: sqlpostgresqlgreatest-n-per-grouppostgresql-8.0

解决方案


您可以使用窗口函数:

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

推荐阅读