如何:SELECT 来自多个互斥的 CTE
How to: SELECT from multiple CTEs that are mutually exclusive
我处于这样一种情况,我需要根据用户所做的推荐显示用户的统计信息,然后显示有关这些推荐用户活动的统计信息。因此,如果用户 A 推荐了用户 B,C 则意味着用户 A 推荐了 2 个用户。现在,我需要了解这些 referred
用户中有多少人确实采取了行动,即购买。但他们可能不会购买计数为 0 的商品。我有以下使用 CTE 的查询,它确实按预期工作,但它也 returns 一些假阴性结果。即
WITH direct_referrals AS (
SELECT id
FROM "user"
WHERE "user"."referredBy" = ${userId}
),
application_stats AS (
SELECT count(status), status
FROM "application"
WHERE "userId" IN (SELECT id FROM direct_referrals)
GROUP BY status
)
SELECT *, (SELECT count(id) FROM direct_referrals) AS "totalReferrals"
FROM application_stats;
如果至少有 1 个推荐用户采取了某些操作,则此查询 return 的结果是正确的,但当 none 已采取任何操作时失败,在这种情况下,此查询 return 是referred
用户为 0,这是不正确的。
我可以看到 SELECT
依赖于 application_stats
CTE,它可能不会 return 任何结果,因此 direct_referrals
也不会 returned .我对 SQL 有点陌生,所以真的不知道有多少选择。感谢任何帮助。
谢谢
更新示例数据和预期结果
// 用户模型
Id username referredBy
---- -------- -------------------
1 jon NULL
2 jane 1
3 doe 1
4 smith 2
5 john 1
// 应用模型
Id userId status
---- -------- -------------------
1 12 'APPLIED'
2 13 'APPLIED'
3 14 'VIEWED'
预期结果(对于 userId = 1):
User (referral) stats Application stats
------------------- -------------------
3 0
实际结果:
User (referral) stats Application stats
------------------- -------------------
0 0
这样的东西应该能满足您的需求:
WITH REFERRAL AS (
SELECT REFERREDBY, COUNT(USERNAME) AS "REF_CNT"
FROM USER_MODEL
WHERE REFERREDBY IS NOT NULL
GROUP BY REFERREDBY
),
APPLICATIONS AS (
SELECT UM.REFERREDBY, COUNT(ML.APPL_STATUS) AS "APPL_CNT"
FROM USER_MODEL UM
LEFT OUTER JOIN APPLICATION_MODEL ML ON UM.ID = ML.USER_ID AND ML.APPL_STATUS = 'PURCHASED'
GROUP BY UM.REFERREDBY
)
SELECT R.REFERREDBY, R.REF_CNT, A.APPL_CNT
FROM REFERRAL R
LEFT OUTER JOIN APPLICATIONS A ON R.REFERREDBY = A.REFERREDBY;
我处于这样一种情况,我需要根据用户所做的推荐显示用户的统计信息,然后显示有关这些推荐用户活动的统计信息。因此,如果用户 A 推荐了用户 B,C 则意味着用户 A 推荐了 2 个用户。现在,我需要了解这些 referred
用户中有多少人确实采取了行动,即购买。但他们可能不会购买计数为 0 的商品。我有以下使用 CTE 的查询,它确实按预期工作,但它也 returns 一些假阴性结果。即
WITH direct_referrals AS (
SELECT id
FROM "user"
WHERE "user"."referredBy" = ${userId}
),
application_stats AS (
SELECT count(status), status
FROM "application"
WHERE "userId" IN (SELECT id FROM direct_referrals)
GROUP BY status
)
SELECT *, (SELECT count(id) FROM direct_referrals) AS "totalReferrals"
FROM application_stats;
如果至少有 1 个推荐用户采取了某些操作,则此查询 return 的结果是正确的,但当 none 已采取任何操作时失败,在这种情况下,此查询 return 是referred
用户为 0,这是不正确的。
我可以看到 SELECT
依赖于 application_stats
CTE,它可能不会 return 任何结果,因此 direct_referrals
也不会 returned .我对 SQL 有点陌生,所以真的不知道有多少选择。感谢任何帮助。
谢谢
更新示例数据和预期结果
// 用户模型
Id username referredBy
---- -------- -------------------
1 jon NULL
2 jane 1
3 doe 1
4 smith 2
5 john 1
// 应用模型
Id userId status
---- -------- -------------------
1 12 'APPLIED'
2 13 'APPLIED'
3 14 'VIEWED'
预期结果(对于 userId = 1):
User (referral) stats Application stats
------------------- -------------------
3 0
实际结果:
User (referral) stats Application stats
------------------- -------------------
0 0
这样的东西应该能满足您的需求:
WITH REFERRAL AS (
SELECT REFERREDBY, COUNT(USERNAME) AS "REF_CNT"
FROM USER_MODEL
WHERE REFERREDBY IS NOT NULL
GROUP BY REFERREDBY
),
APPLICATIONS AS (
SELECT UM.REFERREDBY, COUNT(ML.APPL_STATUS) AS "APPL_CNT"
FROM USER_MODEL UM
LEFT OUTER JOIN APPLICATION_MODEL ML ON UM.ID = ML.USER_ID AND ML.APPL_STATUS = 'PURCHASED'
GROUP BY UM.REFERREDBY
)
SELECT R.REFERREDBY, R.REF_CNT, A.APPL_CNT
FROM REFERRAL R
LEFT OUTER JOIN APPLICATIONS A ON R.REFERREDBY = A.REFERREDBY;