2013-05-22 32 views
3

enter image description here計算反彈的數量與PostgreSQL的

我試圖計算與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

+5

爲什麼你張貼ASCII純文本爲圖像。這使得它很難構建你的樣本數據的測試用例。 http://sqlfiddle.com上的例子將是最好的事情。 –

+2

下面是Postgres的小提琴:http://sqlfiddle.com/#!12/39067順便說一句:有了Postgres,沒有必要存儲'row_number',你可以基於'datetime'列實時生成'row_number'。 –

+1

爲什麼不是1,4,5,6? 1行號後離開現場.... – Justin

回答

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) 
+0

這是非常棒的答案!感謝您的幫助! – user680839

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:我改名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 
     ; 

UPDATE:如果你想與零個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 
     ;