sql >> データベース >  >> RDS >> Mysql

互いに10秒以内にない行の数をカウントします

    この表から始めましょう。何が起こっているのかを簡単に確認できるように、通常のタイムスタンプを使用します。

    180.2.79.3   2011-01-01 08:00:00
    180.2.79.3   2011-01-01 08:00:09
    180.2.79.3   2011-01-01 08:00:20
    180.2.79.3   2011-01-01 08:00:23
    180.2.79.3   2011-01-01 08:00:25
    180.2.79.3   2011-01-01 08:00:40
    180.2.79.4   2011-01-01 08:00:00
    180.2.79.4   2011-01-01 08:00:13
    180.2.79.4   2011-01-01 08:00:23
    180.2.79.4   2011-01-01 08:00:25
    180.2.79.4   2011-01-01 08:00:27
    180.2.79.4   2011-01-01 08:00:29
    180.2.79.4   2011-01-01 08:00:50
    

    私があなたを正しく理解しているなら、あなたはこれらをこのように数えたいと思うでしょう。

    180.2.79.3   3
    180.2.79.4   3
    

    両方の最大タイムスタンプを選択することで、ip_addressごとにこれを行うことができます

    • 現在の行の'stimestampより大きく、
    • 現在の行のタイムスタンプより10秒以下大きい。

    これらの2つの基準を一緒に使用すると、いくつかのnullが発生し、非常に便利であることがわかります。

    select ip_address, 
           t_s.time_stamp, 
           (select max(t.time_stamp) 
            from t_s t 
            where t.ip_address = t_s.ip_address 
              and t.time_stamp > t_s.time_stamp
              and t.time_stamp - t_s.time_stamp <= interval '10' second) next_page
    from t_s 
    group by ip_address, t_s.time_stamp
    order by ip_address, t_s.time_stamp;
    
    ip_address   time_stamp            next_page
    180.2.79.3   2011-01-01 08:00:00   2011-01-01 08:00:09
    180.2.79.3   2011-01-01 08:00:09   <null>
    180.2.79.3   2011-01-01 08:00:20   2011-01-01 08:00:25
    180.2.79.3   2011-01-01 08:00:23   2011-01-01 08:00:25
    180.2.79.3   2011-01-01 08:00:25   <null>
    180.2.79.3   2011-01-01 08:00:40   <null>
    180.2.79.4   2011-01-01 08:00:00   <null>
    180.2.79.4   2011-01-01 08:00:13   2011-01-01 08:00:23
    180.2.79.4   2011-01-01 08:00:23   2011-01-01 08:00:29
    180.2.79.4   2011-01-01 08:00:25   2011-01-01 08:00:29
    180.2.79.4   2011-01-01 08:00:27   2011-01-01 08:00:29
    180.2.79.4   2011-01-01 08:00:29   <null>
    180.2.79.4   2011-01-01 08:00:50   <null>
    

    訪問の終了を示すタイムスタンプには、それ自体のnext_pageがnullになっています。これは、その行のtime_stamp+10秒以下のタイムスタンプがないためです。

    カウントを取得するには、おそらくビューを作成してnullをカウントします。

    select ip_address, count(*)
    from t_s_visits 
    where next_page is null
    group by ip_address
    
    180.2.79.3   3
    180.2.79.4   3
    


    1. パーティションスイッチングを使用した中断の少ないSQLServerテーブルの更新

    2. テーブルの主キーを見つけるためのSQLクエリ?

    3. PDO動的クエリ構築

    4. RailsでActiveRecordを使用するときにRuby正規表現を指定するにはどうすればよいですか?