我有一个看起来像这样的表:
table_name | event_time | row_count | num_of_times_observed
test | 2016-11-30 15:33:47 | 200 | 0
test | 2016-11-30 16:03:03 | 400 | 0
test11 | 2016-11-30 15:33:34 | 300 | 0
test11 | 2016-11-30 15:57:49 | 400 | 0
我想在给定表名的event_time
中找到具有最新值的行(或者更通用地,通过每个不同的表名)。例如,如果我们要查找table_name
,' test11'的最近时间,我们会得到如下结果:
table_name | event_time | row_count | num_of_times_observed
test11 | 2016-11-30 15:57:49 | 400 | 0
我可以想到两种标准(初学者)方法来实现这一目标:
SELECT table_name -- Approach#1
,event_time
,row_count
,num_of_times_observed
FROM my_table AS u
WHERE table_name = 'test11'
ORDER BY event_time DESC LIMIT 1
或者这个:
SELECT table_name -- Approach#2
,event_time
,row_count
,num_of_times_observed
FROM (
SELECT *
FROM my_table
WHERE table_name = 'test11'
) AS u -- I really don't need to filter by table_name here, but I hope it will improve the performance by just a little (especially if there are >100K rows for 'test11')?
INNER JOIN (
SELECT table_name
,max(event_time) AS event_time
FROM my_table
GROUP BY table_name
HAVING table_name = 'test11'
) AS q ON u.table_name = q.table_name
AND u.event_time = q.event_time
假设my_table
中有大约1亿行,我觉得上述方法可能效率不高(优化)。我查看了StackOverflow的可能答案,并找到了更为先进的this one等答案。我想知道是否有更好(有效)的方法来查询所需的结果。
非常感谢您的回答和建议!
答案 0 :(得分:1)
您的第一种方法是最好的方法。
您需要my_table(table_name, event_time)
上的索引。某些数据库允许您在创建索引时在列上指定desc
。
答案 1 :(得分:1)
您也可以使用
每个表
select * from my_table
where ( table_name, event_time) in ( select table_name, max(event_time)
from my_table
group by table_name )
或者如果您使用的数据库不允许使用元组,则可以使用
加入
select * from my_table t1
INNER JOIN (
select table_name, max(event_time) max_event
from my_table
group by table_name ) t2 on t2.table_name = t1.table_name
and t2.max_event = t1.event_time
表示绝对
select * from my_table as u
where event_time in ( select max(event_time ) from my_table)