我正在尝试使用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的链接。
答案 0 :(得分:1)
问题开始于一个速率,但后来变为正确的答案是用户ID 1被退回3次而用户ID 2根本没有反弹所以我正在回答正确答案这是向利率方向迈出的一步。
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
;