ホームページ > データベース > mysql チュートリアル > ギャップとアイランドのある連続イベントの最小時間間隔と最大時間間隔を見つける方法は?

ギャップとアイランドのある連続イベントの最小時間間隔と最大時間間隔を見つける方法は?

Linda Hamilton
リリース: 2024-12-17 21:02:14
オリジナル
787 人が閲覧しました

How to Find Minimum and Maximum Time Intervals for Consecutive Events with Gaps and Islands?

ギャップとアイランドのある連続行の最小値と最大値を求める

行で表されるイベントのシーケンスを含む順序付きデータセットのコンテキスト内テーブルの場合、タスクは、同じイベント タイプを共有する連続する行の最小時間間隔と最大時間間隔を決定することです。この問題は、ギャップやアイランドを含むデータを扱う場合に発生し、従来の集計方法では不十分です。

入力の理解

入力テーブルは次の列で構成されます:

  • name: それぞれの一意の識別子person
  • act: イベント タイプ、「スリープ」または「ウェイク」
  • rn: 各人のイベント シーケンス内の行番号
  • startt: の開始時刻events
  • endd: イベントの終了時刻

連続するグループの識別

連続する行のグループを識別するには同じイベント タイプの場合、イベント タイプの行番号と全体の行番号の差を計算します。番号付け:

row_number() over (partition by name, act order by rn) as seqnum_na
row_number() over (partition by name order by rn) as seqnum_n
ログイン後にコピー

これらの新しい列 seqnum_na と seqnum_n は、それぞれイベント タイプのシーケンス番号と全体のシーケンス番号を表します。 seqnum_n から seqnum_na を減算すると、イベント タイプ内の行の連続する各サブセットのグループ番号を表す新しい列が作成されます。

グループ番号による集計

グループ番号を使用特定できたら、開始時刻と終了時刻を集計して、それぞれの最小値と最大値を見つけることができます。 group:

select name, act, min(startt) as startt, max(endd) as endd
from (select i.*,
             row_number() over (partition by name, act order by rn) as seqnum_na,
             row_number() over (partition by name order by rn) as seqnum_n
      from input i
     ) i
group by (seqnum_n - seqnum_na), name, act;
ログイン後にコピー

名前とイベント タイプとともにこのグループ番号でグループ化することで、各サブセット内の連続する行を効率的に識別して集計し、必要な最小時間間隔と最大時間間隔を提供します。

以上がギャップとアイランドのある連続イベントの最小時間間隔と最大時間間隔を見つける方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート