2016-12-11 23 views
0

私はMySqlを使用しています。私はこのように、ログを持つテーブルがあるとします。1時間間隔でcount> 1のデータを選択してください。

+---------+---------------------+------------+ 
| user_id |  timestamp  | event | 
+---------+---------------------+------------+ 
|  1 | 2016-12-11 01:00:00 | some event | 
|  2 | 2016-12-11 01:00:00 | some event | 
|  2 | 2016-12-11 03:00:00 | some event | 
|  3 | 2016-12-11 01:59:00 | some event | 
|  3 | 2016-12-11 02:00:00 | some event | 
+---------+---------------------+------------+ 

私は、同じユーザーが1時間の任意の間隔で1つの以上のログを持っていたときの機会を見つけるしたいと思います。

+---------+---------------------+------------+ 
| user_id |  timestamp  | event | 
+---------+---------------------+------------+ 
|  3 | 2016-12-11 01:59:00 | some event | 
|  3 | 2016-12-11 02:00:00 | some event | 
+---------+---------------------+------------+ 

ことが可能です:

だから、私は私に次のデータを返すために、クエリをご希望ですか?

+0

'between '演算子にはどのような問題がありますか? 't1とt2の間でタイムスタンプを行うことができます。 – GurV

答えて

1
select * 
from t 
where exists 
     (
      select  null     
      from  t as t2     
      where  t2.user_id = t.user_id 
        and t2.timestamp <> t.timestamp 
        and t2.timestamp between t.timestamp - interval 1 hour 
            and  t.timestamp + interval 1 hour 

     ) 
;    
3

あなたはexistsを使用することができます。

select l.* 
from logs l 
where exists (select 1 
       from logs l2 
       where l2.user_id = l.user_id and 
        l2.timestamp = l.timestamp and 
        l2.timestamp between date_sub(l.timestamp, interval 1 hour) and 
             date_add(l.timestamp, interval 1 hour) 
      ); 

注:両方の行を取得するには、1時間前と1時間後にチェックする必要があります。

+1

これはすべての行を返します。あなたは自己参照を取り除くべきです。 @DuduMarkovitz。 –

+0

。 。それは面白い。最初にソリューションを入力し始めたとき、私は2つの '存在する'を使用するつもりでした(前に1つと後に1つ)。 「間」は入力を減らすための最後の変更でした。 –

関連する問題