SQL - 通过id迭代并限制每个id的结果

时间:2013-10-24 18:36:10

标签: sql loops iteration

在我的数据库中,我正在跟踪游戏中每个用户的所有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个最近的事件?

非常感谢!

1 个答案:

答案 0 :(得分: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