2017-03-24 1 views
1
create table events (
fk_user integer, 
event varchar(40), 
time integer 
); 


Insert into events (fk_user, event, time) 
VALUES 
('1', 'view', '1'), 
('1', 'view', '3'), 
('1', 'view', '4'), 
('1', 'lead', '5'), 
('1', 'view', '6'), 
('1', 'view', '7'), 
('1', 'lead', '9'), 
('2', 'view', '1'), 
('2', 'lead', '2'), 
('2', 'lead', '3'), 
('2', 'view', '6'), 
('2', 'view', '7'), 
('2', 'view', '8'), 
('5', 'view', '1'), 
('5', 'view', '2'), 
('2', 'view', '4'), 
('2', 'lead', '5'), 
('2', 'view', '9'); 

私が探しているのは、「リード」が上から出る前に3つの「ビュー」があります。最初の3回の「時間」の平均をとってみたい。ウィンドウ関数で行うことは可能ですか?
予想される出力は次のようになります(1 + 3 + 4)/ 3 = 2.666(3その後、整数を取った場合)最初のリードイベントが発生する前の平均視聴回数を確認する

+0

前になるviews行の平均値を取得するには、派生テーブルは、あなたが肝炎ありませんすべての鉛の発生のためにそれを行うには? –

+0

最初のリード – Rock

+0

とすべてのユーザーのためだけにはありませんか?どの列が順序を指定していますか? –

答えて

0

あなたはfkuserあたりfirst_lead_timeを見つけることcaseの文と一緒にminウィンドウ関数を使用して、使用することができますfirst_lead_time

select fkuser, avg(time) from (
    select * , 
     min (case when event = 'lead' then time end) over (partition by fkuser) as first_lead_time 
    from events 
) t where time < first_lead_time 
and event = 'view' 
group by fkuser 

別の方法

select e.fk_user, avg(e.time) 
from events e 
join (
    select min(time) first_lead_time, fkuser 
    from events 
    where event = 'lead' 
    group by fkuser 
) t on t.fkuser = e.fkuser 
where e.time < t.first_lead_time 
group by e.fkuser 
関連する問題