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

MySQL GROUP BY DateTime+/-3秒

    私はTomH.の優れたアイデアを使用していますが、ここでは少し異なる方法で使用しています:

    チェーンの始まりであるすべての行を見つける代わりに、すべてのを見つけることができます それがチェーンの始まりです。次に戻って、時間に一致する行を見つけます。

    ここでのクエリ#1は、どの時刻がチェーンの始まりであるかを、その下に3秒以内にある時刻がないことを見つけることによって示す必要があります。

    SELECT DISTINCT Timestamp
    FROM Table a
    LEFT JOIN Table b
    ON (b.Timestamp >= a.TimeStamp - INTERVAL 3 SECONDS
        AND b.Timestamp < a.Timestamp)
    WHERE b.Timestamp IS NULL
    

    次に、各行について、クエリ#2のタイムスタンプよりも小さい最大のチェーン開始タイムスタンプを見つけることができます:

    SELECT Table.id, MAX(StartOfChains.TimeStamp) AS ChainStartTime
    FROM Table
    JOIN ([query #1]) StartofChains
    ON Table.Timestamp >= StartOfChains.TimeStamp
    GROUP BY Table.id
    

    それができたら、必要に応じてグループ化できます。

    SELECT COUNT(*) --or whatever
    FROM Table
    JOIN ([query #2]) GroupingQuery
    ON Table.id = GroupingQuery.id
    GROUP BY GroupingQuery.ChainStartTime
    

    トムHさんの回答とは別に投稿するほど明確かどうかはわかりませんが、実装に問題があるようで、考えていたので、また投稿したいと思いました。頑張ってください!



    1. SQL Serverに保存すると、DateTimeのミリ秒が変更されます

    2. Postgresqlの列から削除されたデータベースシリアルを復元した後

    3. MySQLでフィールドを移動して削除する方法

    4. Oracleで文字列内の単語数をカウントするにはどうすればよいですか?