3

在此处输入图像描述

我正在尝试使用 postgresql 计算有机反弹的数量。我想计算用户访问 site.com 并在查看第一页后离开的所有实例(例如,用户 ID 1 的第 4,5 行和第 6 行。与用户 ID 1 进入的第 1-3 行相反来自谷歌并访问了另外 2 个 site.com 页面。)

正确的答案是用户 ID 1 弹跳了 3 次,而用户 ID 2 根本没有弹跳。我相信 row_number() 和 partition by 可以用来解决这个问题。任何帮助构建 postgressql 查询将不胜感激。

编辑-这里是带有模式和数据的 jfiddle 的链接http://sqlfiddle.com/#!12/39067

4

2 回答 2

1

问题从一个速率开始,但随后变为正确答案将是用户 ID 1 弹跳 3 次,用户 ID 2 根本没有弹跳,所以我正在回答正确答案,这是朝着速率方向迈出的一步.

SQL小提琴

select user_id, count(c = 1 or null)
from (
    select user_id, g, count(*) c
    from (
        select *,
            count(referring_url != 'site.com' or null)
            over (partition by user_id order by datetime) g
        from t
    ) s
    group by user_id, g
) s
group by user_id;
 user_id | count 
---------+-------
       1 |     3
       2 |     0

如果您只想计算搜索引擎,那么:

count(referring_url in (
    'google.com', 'bing.com', 'ask.com', 'yahoo.com'
    ) or null)
于 2013-05-22T11:50:16.270 回答
0
SELECT * FROM Table1 t1
WHERE t1.referring_url <> 'site.com'
AND EXISTS (
        SELECT * FROM Table1 ex
        WHERE ex.user_id = t1.user_id
        AND ex.referring_url <> 'site.com'
        AND ex.stamp < t1.stamp
        );

顺便说一句:我重命名datetimestamp,因为它是保留字。

更新:如果您只对价格感兴趣,您可以这样做;

SELECT t1.user_id, COUNT(*) AS reet
FROM Table1 t1
WHERE t1.referring_url <> 'site.com'
AND EXISTS (
        SELECT * FROM Table1 ex
        WHERE ex.user_id = t1.user_id
        AND ex.referring_url <> 'site.com'
        AND ex.stamp < t1.stamp
        )
GROUP BY t1.user_id
        ;

更新:如果您希望用户的重复次数为零,则可以在 CTE(或子查询)上使用连接:

WITH cnt AS (
        SELECT tx.user_id , COUNT(*) AS cnt
        FROM Table1 tx
        WHERE tx.referring_url <> 'site.com'
        AND EXISTS (
                SELECT * FROM Table1 ex
                WHERE ex.user_id = tx.user_id
                AND ex.referring_url <> 'site.com'
                AND ex.stamp < tx.stamp
                )
        GROUP BY tx.user_id
        )
SELECT DISTINCT t1.user_id
        , COALESCE(cnt.cnt, 0) AS reet
FROM Table1 t1
LEFT JOIN  cnt ON cnt.user_id = t1.user_id
        ;
于 2013-05-22T10:22:18.913 回答