0
開始時刻と終了時刻で示される範囲をカバーするユーザーアクティビティのレコードを持つテーブルがあります。前日の時間単位でシステム内でアクティブなユーザーの数を探しています。開始時刻と終了時刻から派生した1分あたりのセッション数
セッションの最大長は1時間で、時間の境界を超えません。セッションは終了し、新しいセッションは同じ分に開始されます。ここで
は、クエリのストリップダウンバージョンです:
with minutes AS (
-- ignore this...it generates a day's worth of timestamps for each minute
-- it's hairy but is what I'm stuck with on redshift
select (dateadd(minute, -row_number() over (order by true), sysdate::date)) as minute
from seed_table limit 1440
),
sessions as (
select sid, ts_start, ts_end
from user_sessions s
where ts_end >= sysdate::date-'1 day'::interval
and ts_start < sysdate::date
)
select m.minute, count(distinct(s.sid))
from minutes m
left join sessions s on s.ts_end >= m.minute and s.ts_start < m.minute+'1 min'::interval
group by 1
私はその厄介な左を避けるためにしようとしている参加:
-> XN Nested Loop Left Join DS_BCAST_INNER (cost=6913826151.95..4727012848741.55 rows=410434560 width=166)
Join Filter: (("inner".ts_start < ("outer"."minute" + '00:01:00'::interval)) AND ("inner".ts_end >= "outer"."minute"))
はここでほとんどゴードン・リノフの回答に基づいて私のために働いたものです。それは、1分以内にユーザーのセッションが移行するときにカウントされます。しかし、正しい方向のように見えます。元のクエリは同じ理由でカウントされる可能性がありますが、分単位で異なるセッションIDの数を取得する機会はそれを解決します。
- 元のクエリ時間:81301.345ミリ秒
- 和オーバー問合せ時間:36242.342ミリ秒
これはほぼ完璧です。 Redshiftはウィンドウ関数が集合関数ではないので、外側のスコープで分単位でグループ化させません。私は、開始と終了を合計で分けてみようと思っています。そして、外側の範囲で分単位で定期的に集計します。 – systemjack
私は、ローリングサムを計算する前に、毎分の差をキャプチャすることによって動作するようにしました。私が正しいように見える数字。素晴らしい!どうもありがとうございます! – systemjack
まだ正しくはありません。このアプローチの欠点は、ユーザーのセッションが終了し、新しいセッションが同じ分に開始されたときです。これは実際のデータセットでは頻繁に発生します。この結果、少額の小計が発生します。 @ systemjack。 – systemjack