2016-07-12 5 views
0

イベントトラッキングテーブルがあり、そのイベントの影響を受ける場所にイベントをリンクしています。特定の場合、event_idはいくつかに対応します。user_id。各event_tracking要素の数字はevent_waveです。サブクエリの結果で特定の値を見つけよう

特定のイベントに対して、影響を受けたユーザーの数、最大イベントウェーブ(1)を抽出し、の特定のユーザーがイベント(2) 。

私にできることとは別に(1)を使用して:

SELECT COUNT(*), MAX(event_wave) 
FROM event_tracking 
WHERE event_id = 123 

と、(2)を使用して:

SELECT 456 = ANY(SELECT user_id FROM event_tracking WHERE event_id = 123) 

をしかし、それは2を使用せずに、それらの結果(1 & 2)を持つことが可能ですサブクエリ?

答えて

2

例データ:

create table event_tracking (event_id int, user_id int, event_wave int); 
insert into event_tracking values 
(123, 10, 3), 
(123, 20, 2), 
(123, 30, 1); 

あなたがたevent_id = 123のためにすべてのユーザーを取得したい場合:

select count(*), max(event_wave), array_agg(user_id) users 
from event_tracking 
where event_id = 123; 

count | max | users  
-------+-----+------------ 
    3 | 3 | {10,20,30} 
(1 row) 

あなたが最大event_waveとのevent_id = 123をユーザにしたい場合:

select distinct on (event_id) 
    row_number() over (order by event_wave) as count, 
    event_wave as max, 
    user_id 
from event_tracking 
where event_id = 123 
order by event_id, event_wave desc; 

count | max | user_id 
-------+-----+--------- 
    3 | 3 |  10 
(1 row) 

特定のuser_idに簡単なyes/noを設定したい場合:

select count(*), max(event_wave), 456 = any(array_agg(user_id)) yesno 
from event_tracking 
where event_id = 123; 

または

select distinct on (event_id) 
    row_number() over (order by event_wave) as count, 
    event_wave as max, 
    user_id = 456 yesno 
from event_tracking 
where event_id = 123 
order by event_id, event_wave desc; 
+0

を試してみてください。 – 3kt

0

、 `array_agg`機能は完璧な仕事をして、それを指摘して感謝を

SELECT COUNT(*), MAX(event_wave), 
     MIN(CASE WHEN user_id = 459 THEN 'yes' END) 
      As user_459_impacted 
FROM event_tracking 
WHERE event_id = 123 
関連する問題