【问题标题】:How to group latest DATETIME record per day by userId?如何按 userId 对每天最新的 DATETIME 记录进行分组?
【发布时间】:2021-04-23 23:24:14
【问题描述】:

对于这个问题,我在 MySQL 表中有三个字段:iduserIdloginDate(日期时间)。我想返回每个userId 每天的最新记录。如何在下面的 B 部分创建查询以执行以下操作?

A.记录

id userId loginDate
1 5 2021-01-01 00:05:50
2 7 2021-01-01 06:06:50
3 5 2021-01-01 06:34:50
4 3 2021-01-02 06:56:76
5 3 2021-01-02 15:46:52

B.我希望从查询中返回什么

id userId loginDate
2 7 2021-01-01 06:06:50
3 5 2021-01-01 06:34:50
5 3 2021-01-02 15:46:52

【问题讨论】:

  • 我不明白你在标题中的意思。清晰的解释和结果总是有帮助的。
  • 这能回答你的问题吗? Get top n records for each group of grouped results。与DATE(loginDate) 结合使用,它肯定会成功。
  • @GordonLinoff - 抱歉,请再次查看问题。我不小心按了保存,没有准备好!
  • @astentx - 抱歉,请再次查看问题。我不小心按了保存,没有准备好!
  • @GrumpyCrouton 谢谢,请看下文。

标签: mysql sql greatest-n-per-group


【解决方案1】:

对于 MySQL 8,您可以使用 row_number analytic function 以降序排列一天内的时间戳,然后选择每个组的第一项。没有棘手的聚合,限制和连接,它只是根据顺序和分组分配数字,其余行不变。

with a as (
  select 1 as id, 5 as userid, timestamp '2021-01-01 00:05:50' as logindate union all
  select 2, 7, timestamp '2021-01-01 06:06:50' union all
  select 3, 5, timestamp '2021-01-01 06:34:50' union all
  select 4, 3, timestamp '2021-01-02 06:56:56' union all
  select 5, 3, timestamp '2021-01-02 15:46:52'
)
, rn as (
  select a.*,
    row_number() over(
      partition by
        userid,
        date(logindate)
      
      order by
        logindate desc
    ) as __rn
  from a
)
select *
from rn
where __rn = 1
order by userid desc
编号 |用户名 |登录日期 | __rn -: | -----: | :----------------- | ---: 2 | 7 | 2021-01-01 06:06:50 | 1 3 | 5 | 2021-01-01 06:34:50 | 1 5 | 3 | 2021-01-02 15:46:52 | 1

db小提琴here

【讨论】:

    【解决方案2】:

    您应该在一些聚合函数的帮助下使用GROUP BY

    SELECT max(id) AS id, userId, max(loginDate) AS loginDate FROM table GROUP BY userId ORDER BY id ASC;
    

    返回:

    id  userId  loginDate
    2   7   2021-01-01 06:06:50
    3   5   2021-01-01 06:34:50
    5   3   2021-01-02 15:46:52
    

    解释:GROUP BY 被您的查询弄糊涂了,因为多行可能匹配。使用max() 聚合函数允许我们只返回最新的行数据。

    【讨论】:

    • 但它不会产生“按日期结束”的行。
    • 抱歉,请再次查看问题。我不小心按了保存,没有准备好!
    • @GrumpyCrouton - 我尝试过这样的事情。它不会每天按 userId 返回最后一条不同的记录...它会返回每个 userId 的倍数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2022-11-16
    相关资源
    最近更新 更多