如何获取给定记录组中每一天的最后一条记录?

Posted

技术标签:

【中文标题】如何获取给定记录组中每一天的最后一条记录?【英文标题】:How to fetch last record for each day in a given group of records? 【发布时间】:2017-12-15 09:06:51 【问题描述】:

我有一个结构如下的表:

 id | service_name | subscribers_count | date
 1  | service 1    | 1                 | 2017-07-01 01:01:01
 2  | Service 1    | 2                 | 2017-07-01 01:01:02
 3  | Service 1    | 3                 | 2017-07-02 01:01:01
 4  | Service 1    | 2                 | 2017-07-03 01:01:01
 5  | Service 1    | 3                 | 2017-07-04 01:01:01
 6  | Service 2    | 1                 | 2017-07-01 01:01:01
 7  | Service 2    | 2                 | 2017-07-01 01:01:02
 8  | Service 2    | 3                 | 2017-07-01 01:01:03
 9  | Service 2    | 4                 | 2017-07-02 01:01:01

获取每项服务的最后一条记录很容易,但我需要更多 - 我需要获取每天每项服务的最后一条记录。这是我期望得到的:

2  | Service 1    | 2                 | 2017-07-01 01:01:02
3  | Service 1    | 3                 | 2017-07-02 01:01:01
4  | Service 1    | 2                 | 2017-07-03 01:01:01
5  | Service 1    | 3                 | 2017-07-04 01:01:01
8  | Service 2    | 3                 | 2017-07-01 01:01:03
9  | Service 2    | 4                 | 2017-07-02 01:01:01

最有效的写法是什么?

【问题讨论】:

向我们展示最简单的部分 @Strawberry 你是***.com/questions/10999522/… 我看不出“硬”部分比“简单”部分更难;-) 【参考方案1】:

一种方法是where 子句中的相关子查询:

select t.*
from t
where t.date = (select max(t2.date)
                from t t2
                where t2.service_name = t.service_name and
                      date(t2.date) = date(t.date)
               );

【讨论】:

(service_name) - 虽然我同意它应该是一个 id【参考方案2】:

使用您自己的解决方案...

SELECT t1.* 
  FROM messages t1
  JOIN 
     ( SELECT from_id
            , SOMETHING HERE
            , MAX(timestamp) timestamp 
         FROM messages 
        GROUP 
           BY from_id
            , SOMETHING HERE
     ) t2
    ON t1.from_id = t2.from_id 
   AND SOMETHING HERE
   AND t1.timestamp = t2.timestamp;

这个解决方案非常“有效”。尽管您只会欣赏此解决方案与 Gordon 在相当大的数据集上的任何差异,但我怀疑此解决方案的性能会胜过那个解决方案 - 尽管我很高兴被证明是错误的。

【讨论】:

以上是关于如何获取给定记录组中每一天的最后一条记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取一周中每一天的密码?

sql 获取某一时段中每一天中最大的时间的一条记录

Laravel 获取数组中每一天的最新数组项

在几天的持续时间内,选择表格中记录的每一天的最后一个条目

获取表中存在的每个日期的第一条和最后一条记录号

如何以最快的方式获取给定 id 的最后一条记录? (微软 SQL)