San*_*rle 9 sql postgresql postgresql-14
I have the following query which gives me the amount of referrals users have. However, I would like to only count the referral if the referred user has activated the premium plan. How could this be achieved?
Dbfiddle here.
I am using PostgreSQL version 14.
SELECT users.id, users.email, users.premium,
COUNT(referrals.referrer) as referred
FROM users
LEFT JOIN referrals
ON users.id = referrals.referrer
GROUP BY users.id
ORDER BY referred DESC;
Run Code Online (Sandbox Code Playgroud)
D-S*_*hih 13
您可以尝试使用FILTER子句或条件聚合函数。
SELECT users.id, users.email, users.premium,
COUNT(referrals.referrer) FILTER(WHERE premium = true) as referred
FROM users
LEFT JOIN referrals
ON users.id = referrals.referrer
GROUP BY users.id, users.email, users.premium
ORDER BY referred DESC;
Run Code Online (Sandbox Code Playgroud)
编辑
根据您的评论,我认为您可以尝试使用子查询执行聚合函数以premium首先查找用户,然后再查找OUTER JOIN表user。
SELECT u.*,
coalesce(referred,0) referred
FROM users u
LEFT JOIN(
SELECT f.referrer,
COUNT(f.id) FILTER(WHERE u1.premium = true) as referred
FROM users u1
JOIN referrals f
ON u1.id = f.id
GROUP BY f.referrer
) t1
ON t1.referrer = u.id
Run Code Online (Sandbox Code Playgroud)