我有一个具有以下结构的表:
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
什么是最有效的写作方式?
答案 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在相当大的数据集上的任何区别,但我怀疑这个解决方案会胜过那个 - 虽然我很高兴被证明是错误的