2017-10-04 65 views
0

忽略类似行我有一个包含日志和时间戳,例如表:SQL查询,从同一个表

timestmp log_error 
1507031197631 Er7 
1507031197621 Er8 
1507031197409 Er9 
1506888444602 Er10 
1506880074401 Er10 
1506880047684 Er10 
1506880030996 Er10 
1506879980929 Er10 
1506879977580 Er10 
1506879974250 Er10 
1506879970901 Er10 
1506879964241 Er10 
1506879954212 Er10 
1506879900817 Er10 

我想写忽略相同的连续失误(在这种情况下,一个SQL查询, Er10)在时间戳的某个间隔(5分钟)内。我怎样才能做到这一点?使用自我Inner Join?我要的结果是这样的:

timestmp log_error 
1507031197631 Er7 
1507031197621 Er8 
1507031197409 Er9 
1506888444602 Er10 /* The last one from this example, based on the difference in timestmp */ 
1506879900817 Er10 /* The first Er10 registry */ 
+1

。标记您正在使用的DBMS(MySQL,MS SQL Server,Oracle)。 –

+0

@YogeshSharma,已标记,谢谢。 –

+0

丢弃适当的样本数据,以便timestmp列可以转换为datetime.or或使用datetime列抛出数据,然后只能找到5分钟间隔的数据。 – KumarHarsh

回答

0

您可以lag(),累计总和,并group by做到这一点:

select log_error, min(timestamp), max(timestamp) 
from (select l.*, 
      sum(case when prev_le = log_error and 
          prev_timestamp > timestamp - "5 minutes" 
         then 0 else 1 
       end) over (order by timestamp) as grp 
     from (select l.*, 
        lag(log_error) over (order by timestmp) as prev_le, 
        lag(timestmp) over (order by timestmp) as prev_timestmp 
      from logs l 
      ) l 
    ) l 
group by grp, log_error; 

注:- "5 minutes"旨在什么逻辑是该。据推测,这是5 * 605 * 60 * 1000

1

您可以使用row_number来创建连续的log_error值组。这种方法被称为“tabibitosan法”

select log_error, min(timestmp), max(timestmp) 
from (
    select t.*, 
     row_number() over (order by timestmp) 
     - row_number() over (partition by log_error order by timestmp) as grp 
    from your_table t 
    ) t 
group by log_error, grp; 

我承认结果的格式不完全是你怎么想,但它有你需要的信息。