2016-05-07 46 views
-1

因此,我有一張表可以包含一些重複條目需要組合在一起的數據,但我對如何處理這些問題有點不確定。消除連續行中的重複記錄

下面是數據的一個樣本:

+-------+---------------------+------------+--+ 
| id | timestamp   | customerID | | 
+-------+---------------------+------------+--+ 
| 15711 | 2016-05-07 00:46:11 | 11191  | | 
| 15710 | 2016-05-07 00:46:11 | 11191  | | 
| 15709 | 2016-05-07 00:46:05 | 10076  | | 
| 15708 | 2016-05-07 00:46:04 | 10076  | | 
| 15707 | 2016-05-07 00:23:57 | 11192  | | 
| 15706 | 2016-05-07 00:13:59 | 11189  | | 
| 15705 | 2016-05-07 00:05:27 | 11188  | | 
+-------+---------------------+------------+--+ 

如果你看看前兩排(IDS 15711和15710),他們有相同的時間戳,所以你會覺得我可以只通過組時間戳。但是,如果你看下兩行(15709和15708),你可以看到時間戳相差一秒鐘。在我的數據中,這些時間戳可以相差幾秒鐘,但如果它們是連續的行,我想將它們組合在一起。

他們通常成對出現,但我也見過三人一組。

將這些行分組在一起的最佳方式是什麼?

在此先感謝。

+1

鑑於上述設定的數據,將所需的結果集是什麼樣子? – Strawberry

+0

如果你有一排100行,相隔一秒鐘,會發生什麼?此外,在您的數據中,它看起來像客戶ID彙總做你想要的。 –

+0

我想要將行15711和15710分組在一起以及15709和15708.它們的確切時間戳或id不一定重要。我將要對這些數據進行計數,並希望刪除重複項。 –

回答

0

如果你想找出「情節」爲一個客戶,你可以這樣做的:

select customerId, count(*) as numrows, 
     min(id), max(id), min(timestamp), max(timestamp) 
from (select t.*, 
      (@grp := if(@c = customerId, @grp, 
         if(@c := customerId, @grp + 1, @grp + 1) 
         ) 
      ) as grp 
     from t cross join 
      (select @c := '', @grp:= 0) params 
     order by id 
    ) t 
group by customer, grp;