跨中间表交叉连接
Cross Join across intermediary tables
我有一个包含 3 tables 的数据库:队列时间段、用户和事件。
队列有很多用户,每个用户有很多事件。队列也有与之相关的时间段。我想知道每个队列、每个时间段发生了多少事件。
如果有 2 个 table,那么做一个 CROSS JOIN
会很容易,但是当有这个中介 table 时我就卡住了。
这是数据库结构:
create table time_periods (
cohort_name varchar,
period_name varchar,
start_time timestamp,
end_time timestamp);
create table users (
cohort_name varchar,
user_name varchar
);
create table events (
user_name varchar,
ts timestamp);
insert into time_periods values
('cohort1', 'first', '2017-01-01', '2017-01-10'),
('cohort1', 'second', '2017-01-10', '2017-01-20'),
('cohort2', 'first', '2017-01-15', '2017-01-20');
insert into users values
('cohort1', 'alice'),
('cohort2', 'bob');
insert into events values
('alice', '2017-01-07'),
('alice', '2017-01-17'),
('bob', '2017-01-18');
这是我可以通过 SQL 获得的最大信息 - 进行三重交叉连接但它不正确 - 结果是 6 个事件,而实际上每行应该只有 1 个。
select
time_periods.cohort_name,
period_name,
count(ts)
from time_periods, users, events
group by 1, 2
order by time_periods.cohort_name
这是 SQL小提琴:
您需要指定要连接表的列
如果我正确理解你的数据,你需要这样的东西:
select
tp.cohort_name,
tp.period_name,
count(*)
from time_periods tp
inner join users u on tp.cohort_name = u.cohort_name
inner join events e on u.user_name = e.user_name and e.ts between tp.start_time and tp.end_time
group by 1, 2
order by tp.cohort_name
在这里,您仅针对正确群组中的用户从 time_periods
加入到 users
,然后仅针对特定时间段内的指定用户和事件加入 events
,然后分组1 和 2 得到正确的偶数
我有一个包含 3 tables 的数据库:队列时间段、用户和事件。
队列有很多用户,每个用户有很多事件。队列也有与之相关的时间段。我想知道每个队列、每个时间段发生了多少事件。
如果有 2 个 table,那么做一个 CROSS JOIN
会很容易,但是当有这个中介 table 时我就卡住了。
这是数据库结构:
create table time_periods (
cohort_name varchar,
period_name varchar,
start_time timestamp,
end_time timestamp);
create table users (
cohort_name varchar,
user_name varchar
);
create table events (
user_name varchar,
ts timestamp);
insert into time_periods values
('cohort1', 'first', '2017-01-01', '2017-01-10'),
('cohort1', 'second', '2017-01-10', '2017-01-20'),
('cohort2', 'first', '2017-01-15', '2017-01-20');
insert into users values
('cohort1', 'alice'),
('cohort2', 'bob');
insert into events values
('alice', '2017-01-07'),
('alice', '2017-01-17'),
('bob', '2017-01-18');
这是我可以通过 SQL 获得的最大信息 - 进行三重交叉连接但它不正确 - 结果是 6 个事件,而实际上每行应该只有 1 个。
select
time_periods.cohort_name,
period_name,
count(ts)
from time_periods, users, events
group by 1, 2
order by time_periods.cohort_name
这是 SQL小提琴:
您需要指定要连接表的列 如果我正确理解你的数据,你需要这样的东西:
select
tp.cohort_name,
tp.period_name,
count(*)
from time_periods tp
inner join users u on tp.cohort_name = u.cohort_name
inner join events e on u.user_name = e.user_name and e.ts between tp.start_time and tp.end_time
group by 1, 2
order by tp.cohort_name
在这里,您仅针对正确群组中的用户从 time_periods
加入到 users
,然后仅针对特定时间段内的指定用户和事件加入 events
,然后分组1 和 2 得到正确的偶数