使用datetime列

时间:2016-11-30 21:50:45

标签: sql vertica

我有一个看起来像这样的表:

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等答案。我想知道是否有更好(有效)的方法来查询所需的结果。

非常感谢您的回答和建议!

2 个答案:

答案 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)