2017-04-18 56 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'的行。你運行了完整的查詢嗎? –

相關問題