2012-11-07 82 views
0

我有一個表,看起來像值如下:刪除行基於相鄰行

eventId activity timestamp 
1   0   2012-10-22 20:10:00 
2   0   2012-10-22 20:10:20 
3   1   2012-10-22 20:11:25 
4   1   2012-10-22 20:12:20 
5   1   2012-10-22 20:12:22 
6   0   2012-10-22 20:12:30 <-- 
7   1   2012-10-22 20:12:25 <-- 
8   0   2012-10-22 20:14:46 
9   0   2012-10-22 20:14:48 
10   1   2012-10-22 20:15:45 
11   0   2012-10-22 20:16:00 
12   0   2012-10-22 20:17:00 
13   0   2012-10-22 20:17:13 

我想刪除具有爲0的活動,而不是按時間順序旁邊的每一行所以從這個例子中我將刪除具有eventID 1,8,12和13的行。可以將事件異步地插入到表中,如行6和7所示。

I知道我可以通過檢查每個單獨的行併發出一個查詢來刪除它,如果它符合我的標準,可以在循環中執行此操作,但這非常低效。我想知道是否可以在一個查詢中完成這一切。

好像如果我可以做同樣的事情到

delete from mytable 
where activity = 0 
and (rownumber()+1).activity = 0 
and (rownumber()-1).activity = 0 
order by timestamp 

這將是簡單的,但我不認爲這樣的功能是可能的。

+1

你可以嘗試一個子查詢,使用'ID-1'和'ID + 1'來檢查'相鄰'列 –

回答

2

這裏是你如何選擇你要保留的記錄:

select m.eventId 
from (
    select t1.eventId, 
     max(t2.timestamp) as previousTime, 
     min(t3.timestamp) as nextTime 
    from mytable t1 
    left outer join mytable t2 on t1.eventId <> t2.eventId and t2.timestamp < t1.timestamp 
    left outer join mytable t3 on t1.eventId <> t3.eventId and t3.timestamp > t1.timestamp 
    group by t1.eventId 
) m 
left outer join mytable tb on m.previousTime = tb.timestamp 
left outer join mytable ta on m.nextTime = ta.timestamp 
where tb.activity = 1 
    or ta.activity = 1 

SQL Fiddle Example

然後你可以這樣做:

delete from mytable 
where mytable.eventId not in (...) <--above query 
+0

看起來這會解決我的問題!謝謝! –