自我加入子查询

时间:2016-09-30 02:59:12

标签: sql postgresql subquery self-join

在我自我加入以获得保留率时,我能采取哪些措施来防止性能下降?我想使用子查询,但不知道该怎么做。

SELECT 
    CAST(AA.timestamp AS DATE) AS Date,
    COUNT(DISTINCT AA.userid) AS ActiveUser, 
    COUNT(DISTINCT Future.userid) AS RetainedUser, 
    COUNT(DISTINCT Future.userid)/COUNT(DISTINCT AA.userid) :: float 
    AS RetentionRate
FROM AA
    LEFT JOIN AA AS Future
        ON AA.userid= Future.userid
    AND CAST(AA.timestamp AS DATE)= CAST(Future.timestamp AS DATE)-INTERVAL'3 Day'
GROUP BY 1;

我刚刚找到了答案。

SELECT 
    Active.Date,
    COUNT(DISTINCT Active.userid) AS ActiveUser, 
    COUNT(DISTINCT Future.userid) AS RetainedUser, 
    COUNT(DISTINCT Future.userid)/COUNT(DISTINCT Active.userid) :: float AS RetentionRate
FROM   (SELECT 
        CAST(AA.timestamp AS DATE) AS Date,
        userid
        FROM AA
        GROUP BY CAST(AA.timestamp AS DATE), userid) AS Active
    LEFT JOIN 
    (SELECT 
        CAST(AA.timestamp AS DATE) AS Date,
        userid
        FROM AA
        GROUP BY CAST(AA.timestamp AS DATE), userid) AS Future
        ON Active.userid= Future.userid
    AND Active.Date= Future.Date-INTERVAL'3 Day'
GROUP BY 1;

0 个答案:

没有答案