使用postgresql计算跳出次数

时间:2013-05-22 07:06:24

标签: sql postgresql

enter image description here

我正在尝试使用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查询的帮助都将不胜感激。

编辑 - 这是指向带有架构和数据{j}的jfiddle的链接。

2 个答案:

答案 0 :(得分:1)

问题开始于一个速率,但后来变为正确的答案是用户ID 1被退回3次而用户ID 2根本没有反弹所以我正在回答正确答案这是向利率方向迈出的一步。

SQL Fiddle

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)

答案 1 :(得分: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
        );

BTW:我将datetime重命名为stamp,因为它是一个保留字。

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

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
        ;

更新:如果您希望用户的reeats为零,则可以在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
        ;