我有一个事件跟踪表,它将事件链接到受其影响的用户。对于特定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)?
答案 0 :(得分: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)
如果您希望用户使用max_ 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设置简单的是/否:
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;
答案 1 :(得分:0)
尝试
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