1

在我的数据库中,我正在跟踪游戏中每个用户的所有 UI 事件。我想为每个用户提取最后 5 个事件。

SELECT usr.id, evt.name, evt.utc_timestamp AS Date
FROM usr
JOIN evt ON usr.id = evt.user_id
ORDER BY Date DESC
LIMIT 5

这个查询当然不会起作用,因为它只检索任何用户最近的 5 个事件。

但我的目标是为每个用户创建一个包含 5 行的列表。因此,有没有办法遍历我的用户表并为每个用户附加 5 个最新事件?

非常感谢 !

4

1 回答 1

1

如果你的数据库中有窗口函数,你可以这样做:

select
    id, name, Date
from (
    select
        usr.id, evt.name, evt.utc_timestamp as Date,
        row_number() over(partition by usr.id ordr by evt.utc_timestamp desc) as rn
    from usr
        inner join evt on usr.id = evt.user_id
) as A
where rn <= 5

在 SQL Server 中,可以使用 apply:

select
    usr.id, evt.name, evt.utc_timestamp as Date
from usr
    outer apply (
        select top 5 *
        from evt
        where usr.id = evt.user_id
        order by evt.utc_timestamp desc
    ) as evt
于 2013-10-24T18:41:15.630 回答