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

时间:2017-07-11 10:40:24

标签: mysql sql

我有一个具有以下结构的表:

 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

什么是最有效的写作方式?

2 个答案:

答案 0 :(得分: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)
               );

答案 1 :(得分:0)

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

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在相当大的数据集上的任何区别,但我怀疑这个解决方案会胜过那个 - 虽然我很高兴被证明是错误的