heng_zou 2023-06-16 16:57 采纳率: 50%
浏览 28
已结题

sql分组限制分组数据

mysql能使用一条sql实现这样的数据查询吗?
我有一张消息日志表记录用户发送的消息,主要包含字段user_id(用户id),create_time(发送时间)。
现在我希望统计每个用户每天发送前10条消息的平均时间,忽略少于10条的用户,同时当用户当天发送消息超过10条时只取最早发送的前10条数据做分组。我目前的 方案时先按用户分组查出超过10条发言的用户,然后再对分组结果进行处理:sql如下:

select user_id,group_concat(create_time order by create_time asc) ct from msg_log
where create_time > CURDATE() and create_time < DATE_ADD(CURDATE(),INTERVAL 1 day)
having count(*) >= 10

拿到ct字段后取前10个值求平均然后忽略10条后面的数据,这因为group_concat只能取1024个字符可能会出现截断问题,我期望能够直接通过sql实现这样的功能,网络上搜以一圈似乎没有类的需求。

  • 写回答

3条回答 默认 最新

  • 心寒丶 优质创作者: 编程框架技术领域 2023-06-16 17:29
    关注

    先排序生成序号,然后再计算,这样试试

    SELECT user_id, AVG(create_time) AS avg_time FROM (
        SELECT user_id, create_time FROM (
            SELECT user_id, create_time, ROW_NUMBER() OVER(PARTITION BY user_id, DATE(create_time) ORDER BY create_time) AS row_num
            FROM msg_log
            WHERE create_time >= CURDATE() AND create_time < DATE_ADD(CURDATE(), INTERVAL 1 DAY)
        ) AS t
        WHERE row_num <= 10
    ) AS t2
    GROUP BY user_id
    HAVING COUNT(*) >= 10;
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月24日
  • 已采纳回答 6月16日
  • 创建了问题 6月16日