如何: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;