[英]aggregate inner query SQL optimization
我有3张桌子:
create table users
(
user_id varchar(50),
birth_year int,
country varchar(50)
)
create table notifications
(
status varchar(50),
user_id varchar(50),
created_date datetime
)
create table transactions
(
transaction_id varchar(50),
user_id varchar(50),
created_date datetime
)
我想要做的是让所有收到通知的用户,在通知到达前 7 天与通知到达后 7 天的平均交易有什么区别,按国家和年龄组划分。
我所做的是以下内容:
select q.country
, case when q.age <= 18 then '<= 18'
when q.age <= 30 then '19 - 30'
when q.age <= 45 then '31 - 45'
when q.age <= 60 then '46 - 60'
else '> 60' end as age_group
, AVG(q.prev_transactions*1.0) as avg_prev_transactions, AVG(q.post_transactions*1.0) as avg_post_transactions
from (
select n.user_id, n.created_date, u.country, (2019 - u.birth_year) as age
, count(distinct prev.transaction_id) as prev_transactions, count(distinct post.transaction_id) as post_transactions
from notifications n
left outer join transactions post on n.user_id = post.user_id and post.created_date > n.created_date and post.created_date < n.created_date + interval '7' day
left outer join transactions prev on n.user_id = prev.user_id and prev.created_date < n.created_date and prev.created_date > n.created_date - interval '7' day
left outer join users u on u.user_id = n.user_id
where status = 'SENT'
group by n.user_id, n.created_date, u.country, (2019 - u.birth_year)
--order by n.user_id asc, n.created_date asc
) as q
group by q.country, case when q.age <= 18 then '<= 18'
when q.age <= 30 then '19 - 30'
when q.age <= 45 then '31 - 45'
when q.age <= 60 then '46 - 60'
else '> 60' end
我想知道是否有办法使其更有效。
谢谢
您对“交易”的两个左连接可能是一个问题。 如果有 30 个 prev 事务和 30 个 post 事务,那么这两个连接本质上是笛卡尔连接在一起,创建了 900 个 prev-post 配对。 然后使用 DISTINCT 将这些减少回 30。 但是您所做的工作既要创建,又要删除无意义的行。
您可以将它们分别放在一个子选择中,而不是作为连接。
select n.user_id, n.created_date, u.country, (2019 - u.birth_year) as age,
(select count(*) from transactions post on n.user_id = post.user_id and post.created_date > n.created_date and post.created_date < n.created_date + interval '7' day) as post_transactions,
...
另外,为什么左加入反对用户? 对于没有用户的通知,可以获得哪些可能有意义的输出?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.