MySQL获取每天的最早记录

Posted

技术标签:

【中文标题】MySQL获取每天的最早记录【英文标题】:MySQL get earliest record of each day 【发布时间】:2020-09-29 14:52:39 【问题描述】:

下面的查询为我提供了每个用户每天的一条记录。如何修改它,以便它为我提供每个用户每天最早的记录?

我尝试在GROUP BY 部分的date 字段上使用MIN(),但这显然不起作用。 this answer 中提到了一个 date_trunc 函数,它似乎可以满足我的要求,但它在 mysql 中不可用。解决此问题的最佳方法是什么?

对于下面的示例数据,查询应返回 ID 为 1、3、5 和 7 的记录。

SELECT user_id, coords, date
FROM table
WHERE draft = 0
GROUP BY user_id, DAY('date')

CREATE TABLE `table` (
  `id` bigint(20) UNSIGNED NOT NULL,
  `user_id` int(11) NOT NULL,
  `coords` point NOT NULL,
  `date` datetime NOT NULL,
  `draft` tinyint(4) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `table` (`id`, `user_id`, `coords`, `date`, `draft`) VALUES
(1, 1, xxx, '2020-11-08 18:01:47', 0),
(2, 1, xxx, '2020-11-08 18:05:47', 0),

(3, 1, xxx, '2020-11-09 18:06:47', 0),
(4, 1, xxx, '2020-11-09 18:07:47', 0),

(5, 2, xxx, '2020-11-08 17:01:47', 0),
(6, 2, xxx, '2020-11-08 17:05:47', 0),

(7, 2, xxx, '2020-11-09 14:00:47', 0),
(8, 2, xxx, '2020-11-09 14:05:47', 0),

【问题讨论】:

你的服务器版本是多少? 【参考方案1】:

一种典型的方法是使用相关子查询进行过滤:

select t.*
from mytable t
where t.draft = 0 and t.date = (
    select min(t1.date) 
    from mytable t1 
    where t1.draft = t.draft and t1.user_id = t.user_id and date(t1.date) = date(t.date)  
)

您可以通过使用半开间隔进行过滤来稍微优化子查询:

select t.*
from mytable t
where t.draft = 0 and t.date = (
    select min(t1.date) 
    from mytable t1 
    where 
        t1.user_id = t.user_id 
        and t1.draft = t.draft
        and t1.date >= date(t.date)
        and t1.date <  date(t.date) + interval 1 day
)

第二个查询应该能够利用(draft, user_id, date) 上的索引。

或者,如果你运行的是 MuSQL 8.0,你也可以使用窗口函数:

select *
from (
    select t.*, row_number() over(partition by user_id, date(date) order by date) rn
    from mytable t
    where draft = 0
) t
where rn = 1

【讨论】:

【参考方案2】:

用途:

SELECT user_id, coords, date
FROM `table`
WHERE draft = 0
GROUP BY DAY('date'), user_id order by user_id, date

【讨论】:

以上是关于MySQL获取每天的最早记录的主要内容,如果未能解决你的问题,请参考以下文章

如何获取每组最早日期的记录

在laravel中每天获取数据

按日期获取表的所有先前记录 MySQL

sql查询获取最早日期

如何在 BigQuery 中获取每天的累积记录

sqlserver 获取到日期范围内每天,每周,每月,每年记录