用postgresql计算反弹次数

用postgresql计算反弹次数,sql,postgresql,Sql,Postgresql,我试图用postgresql计算有机反弹的次数。我想统计用户访问site.com并在查看第一页后离开的所有实例,例如用户ID 1的第4、5和6行。与第1-3行不同,在第1-3行中,用户ID 1来自谷歌,访问了另外2个site.com页面 正确答案是用户ID 1反弹了3次,而用户ID 2根本没有反弹。我相信row_数和partition by可以用来解决这个问题。任何帮助构建postgressql查询的人都将不胜感激 编辑-这里有一个链接,指向jfiddle模式和数据 更新:如果您希望用户也具有零

我试图用postgresql计算有机反弹的次数。我想统计用户访问site.com并在查看第一页后离开的所有实例,例如用户ID 1的第4、5和6行。与第1-3行不同,在第1-3行中,用户ID 1来自谷歌,访问了另外2个site.com页面

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

编辑-这里有一个链接,指向jfiddle模式和数据

更新:如果您希望用户也具有零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
        ;

这个问题是从一个速率开始的,但是它变为正确的答案,用户ID 1反弹了3次,用户ID 2根本没有反弹,所以我回答的是正确的答案,这是速率方向上的一步

如果只计算搜索引擎,则:

count(referring_url in (
    'google.com', 'bing.com', 'ask.com', 'yahoo.com'
    ) or null)

为什么要将纯ascii文本作为图像发布。这使得构建样本数据的测试用例变得非常困难。举一个关于的例子是最好的做法。这里是对Postgres的处理:顺便说一句:对于Postgres,不需要存储行号,您可以根据datetime列动态生成行号。为什么不使用1、4、5、6?第1排之后,他离开现场……第1、2、3排是一组。用户ID 1来自google,然后访问了站点中的另外两个页面(第2和第3行)。对于第4、5、6行,用户ID 1来自google left,从bing.com返回,然后离开并从ask.com访问站点。第4、5、6行的用户ID 1查看了一个页面,然后离开并通过搜索引擎返回。不可能知道google.com或其他搜索站点何时访问该站点。那个么问题是,你们有搜索网站的列表吗?如果有一个搜索网站列表,就可以找到网页是否从搜索网站访问过,并给出正确的结果。这是一个很好的答案!谢谢你的帮助!
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
        ;
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)