2017-04-18 55 views
0

,比如我有表:查找所有记录在其他两个值之间的一列超过3个值在该列

COL_0 COL_1 COL_2 
11111 BBBB RECORD DELETED 
11111 BBBB RECORD ADDED 
11111 AA  lalala 
11111 BBBB RECORD ADDED 
11111 AA  lalala 
11111 CCCCCC RECORD ADDED 
11111 AA  lalala 
11111 BBBB RECORD ADDED 
11111 AA  lalala 
11111 BBBB RECORD ADDED 
11111 CCCCCC RECORD ADDED 
11111 AA  lalala 
11111 BBBB RECORD DELETED 
11111 AA  lalala 
11111 BBBB RECORD ADDED 
11111 BBBB RECORD ADDED 
11111 AA  lalala 
11111 CCCCCC RECORD ADDED 
11111 AA  lalala 
11111 BBBB RECORD DELETED 
11111 AA  lalala 
11111 BBBB RECORD ADDED 
11111 AA  lalala 
11111 BBBB RECORD ADDED 
11111 CCCCCC RECORD ADDED 
11111 AA  lalala 
11111 BBBB RECORD DELETED 

COL_0是ID和真表也有许多不同的ID。 012_COL_1链接到另一个表。 COL_2在其他表上操作。

这是无法更改的。问题是该应用程序无法正常工作,并在某些情况下删除记录。现在我需要找到两个“RECORD DELETED”之间的所有ID大于3的“RECORD ADDED”。有什么办法吗?

BR,

+0

SQL表代表*无序*套。您需要一个指定行顺序的列。 –

+0

为了进一步阐述,每个操作都没有任何时间相关的信息-timestamp?没有它,你无法做任何事情 – rpd

+0

有创建和改变时间。我必须在六个月后找到所有人,但我不知道更准确。 – MikeL

回答

0

是的,你可以通过使用分析功能做到这一点 - 假设你有一个指定排序的列。我将假定有一个dte列与此信息。

我会从识别组开始,使用记录已删除记录的累计总和。然后我会计算每个组中添加的记录:

select id, min(dte), max(dte) 
from (select t.*, 
      sum(case when col_2 = 'RECORD DELETED' then 1 else 0 end) over (partition by col_1 order by dte) as grp 
     from t 
    ) t 
where col_2 = 'RECORD ADDED' 
group by id, grp 
having count(*) >= 3; 

注意:这会在出现这种情况时发生。如果你真的只是想的ID,那么你可以使用select distinctgroup by - 罕见的场合之一,这是一个恰当的解决方案:

select distinct id 
from (select t.*, 
      sum(case when col_2 = 'RECORD DELETED' then 1 else 0 end) over (partition by col_1 order by dte) as grp 
     from t 
    ) t 
where col_2 = 'RECORD ADDED' 
group by id, grp 
having count(*) >= 3; 
+0

是的,有指定顺序的栏。谢谢,我会尝试一些与此并报告。 – MikeL

+0

我错过了一些东西...我从(select t。*, sum(col_2 ='RECORD DELETED'then 1 else 0 end) t )t并且返回表中的每个id。 – MikeL

+0

@MikeL。 。 。这是子查询。外部查询只返回带有'RECORD ADDED'的行。你运行了完整的查询吗? –

相关问题