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

SQL:デバイスセットごとに同じ値が連続して出現するすべてのレコードをカウントし、最大のカウントを返します

    これはギャップと島の形です。行番号の違いを使用して、島を取得できます:

    select device_id, speed, count(*) as num_times
    from (select t.*,
                 row_number() over (partition by device_id order by datetime) as seqnum,
                 row_number() over (partition by device_id, speed order by datetime) as seqnum_s
          from t
         ) t
    group by device_id, speed, (seqnum - seqnum_s);
    

    次に、最大値を取得するには、ウィンドウ関数の別のレイヤーを使用します。

    select device_id, speed, num_times
    from (select device_id, speed, count(*) as num_times,
                 row_number() over (partition by device_id order by count(*) desc) as seqnum
          from (select t.*,
                       row_number() over (partition by device_id order by datetime) as seqnum,
                       row_number() over (partition by device_id, speed order by datetime) as seqnum_s
                from t
               ) t
          group by device_id, speed, (seqnum - seqnum_s)
         ) ds
    where seqnum = 1;
    



    1. かなりのパーマリンクと投稿タイトルのリストをエクスポートする

    2. MySQLでバージョン文字列(x.y.z)を比較する方法は?

    3. MySQLで1つのテーブルが空の場合に複数のテーブルを選択する

    4. MariaDBで接続の照合を表示する3つの方法