【问题标题】:SQL: get Nth item in each groupSQL:获取每组中的第 N 个项目
【发布时间】:2008-12-08 15:54:05
【问题描述】:

我有一个这样的用户表

user_id | community_id | registration_date
--------------------------------------------
1       |     1        | 2008-01-01
2       |     1        | 2008-05-01
3       |     2        | 2008-01-28
4       |     2        | 2008-07-22
5       |     3        | 2008-01-11

对于每个社区,我想获取第三个用户注册的时间。我可以使用 MySql 的“限制”SQL 扩展轻松地为单个社区执行此操作。例如,对于 ID=2 的社区

select registration_date
from user
order by registration_date
where community_id = 2
limit 2, 1

或者,我可以通过以下方式获取第一个用户注册所有社区的日期:

select community_id, min(registration_date) 
from user 
group by 1

但我不知道如何在单个 SQL 语句中获取所有个社区的第三个用户的注册日期。

干杯, 唐

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    使用内部选择:

    select 
      registration_date, community_id 
    from 
      user outer 
    where 
      user_id IN (
        select 
          user_id 
        from 
          user inner 
        where 
          inner.community_id = outer.community_id 
        order by 
          registration_date 
        limit 2,1
      )
    order by registration_date
    

    选择用户集合,其中每个用户都是社区中的第三个用户,由内部选择中的限制子句返回。

    【讨论】:

    • 这不起作用,因为内部选择可能返回多个值。我正在使用的 MySql 版本不允许在内部选择中使用 LIMIT,所以我不能简单地将“=”替换为“IN”
    • 啊,是的,使用旧版本的 MySQL 可能会很痛苦。如果你不能 LIMIT 内部选择,我不确定你能做什么。
    • 由于您的版本限制,您可能不得不将其分解为多个语句。
    【解决方案2】:

    这是你的意思吗?

    SELECT registration_date
    FROM user
    ORDER BY registration_date
    LIMIT n
    

    n 是您关注的用户。

    【讨论】:

    • 不,我想获取每个社区的第 N 个用户注册日期
    猜你喜欢
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 2021-09-16
    • 2015-11-01
    • 2021-10-05
    相关资源
    最近更新 更多