2014-09-23 92 views
0

我有IP的和查看日期和與網站ID網站計數的用戶會話的數量

+------------+-----------+---------------------+ 
| website_id | ip  | view_date   | 
+------------+-----------+---------------------+ 
| 123  | 123123123 | 2014-01-01 10:23:00 | 
+------------+-----------+---------------------+ 
| 123  | 987987987 | 2014-01-01 10:23:00 | 
+------------+-----------+---------------------+ 
| 123  | 123123123 | 2014-01-01 10:26:00 | 
+------------+-----------+---------------------+ 
| 123  | 987987987 | 2014-01-01 10:24:00 | 
+------------+-----------+---------------------+ 
| 123  | 987987987 | 2014-01-01 10:25:00 | 
+------------+-----------+---------------------+ 
| 123  | 123123123 | 2014-01-02 03:23:00 | 
+------------+-----------+---------------------+ 

我想獲得從表中的會話表,這將是一次有人開始在現場直到完成。要查明它們何時完成,在view_date被命令desc時,在兩個查看日期之一之後有30分鐘或更多沒有活動。

所以,用本實施例中數據我有2個用戶123123123987987987

  • 用戶123123123具有2個會話,因爲第3行中的行1和行6發生後30分鐘發生與3行後超過30分鐘
  • 用戶987987987有1個會話,因爲行4列2發生後不到30分鐘,列5行發生後不到30分鐘4

我不知道我該怎麼禾我計算使用MySQL。我所知道的是採取由ip,然後通過view_date的數據訂單。之後我迷路了。

當我說會話我的意思是:

一段致力於某個特定活動時間。

而不是:

跟蹤多個網頁之間的人的一種方式。

所需的輸出:

+------------+-----------+----------+ 
| website_id | ip  | sessions | 
+------------+-----------+----------+ 
| 123  | 123123123 | 2  | 
+------------+-----------+----------+ 
| 123  | 987987987 | 1  | 
+------------+-----------+----------+ 
+0

此表結構工作了嗎?你現在在收集數據嗎? – AndreDuarte 2014-09-23 16:48:52

+0

是的,我有數百萬行 – 2014-09-23 16:49:45

+1

那麼期望的輸出是什麼?你能提供一個例子嗎? – SQLChao 2014-09-23 16:54:29

回答

1
select ip, sum(session) + 1 as session 
from (
    select 
    t.*, 
    if(@previp = ip and timestampdiff(minute, @prevview, view_date) >= 30, 1, 0) as session, 
    @previp := ip, 
    @prevview := view_date 
    from 
    Table1 t 
    , (select @prevview := (select view_date from Table1 order by ip, view_date limit 1), 
     @previp := null) var_init_subquery 
    order by ip, view_date 
) sq 
group by ip 
-1

根據時間和IP,您可以用光標找到會話總數排序後。您可以從here獲得有關mysql遊標的更多信息。

更多細節:

CREATE PROCEDURE curdemo() 
BEGIN 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE i INT; 
    DECLARE prev_i INT; 
    DECLARE d DATE; 
    DECLARE prev_d DATE; 
    DECLARE cur1 CURSOR FOR SELECT ip, view_date FROM table; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

    OPEN cur1; 

    read_loop: LOOP 
    IF prev_i == NULL THEN 
     FETCH cur1 INTO prev_i, prev_d; 
    END IF; 
    FETCH cur1 INTO i, d; 
    IF done THEN 
     LEAVE read_loop; 
    END IF; 
    IF prev_i == i && INTERVAL_BETWEEN(prev_d, d) > 30min THEN 
     ADD_IN_SESSIONS_FOR_i ; 
    END IF; 
    prev_i = i; 
    prev_d = d; 
    END LOOP; 

    CLOSE cur1; 
END; 
+0

這不提供問題的答案。請添加更多信息。 – AndreDuarte 2014-09-23 17:04:46

+0

它也是一個鏈接唯一的答案 – 2014-09-23 17:07:12

1
SET @a := null; 
SET @b := null; 
SET @c := null; 
SELECT website_id, ip, view_date, COUNT(counting) as num_sessions 
FROM 
( SELECT website_id, ip, view_date, 
     @c := if(@a = ip AND @b BETWEEN view_date - interval 30 minute AND view_date, @c + 1, 1) as counting, 
     @a := ip, @b := view_date 
    FROM 
    ( SELECT * 
     FROM sessions 
     ORDER BY ip, view_date 
    )t 
)t1 
WHERE counting = 1 
GROUP BY ip; 

DEMO

1

這裏是我的解決方案

我做了數以找出行日期和日期-30分鐘之間發生的特定網站ID和IP地址的數量。如果它的0賦值1意味着它的一個新的會話,否則給它一個0.然後做一筆總和。

SQL Fiddle Demo

select website_id, 
    ip, 
    sum(newSession) as Sessions 
from 
(select *, 
case 
    when (select count(*) 
      from yourTable ytb 
      where ytb.website_id = yta.website_id 
      and ytb.ip = yta.ip 
      and ytb.view_date < yta.view_date 
      and ytb.view_date > date_add(yta.view_date, INTERVAL -30 MINUTE)) = 0 then 1 
    else 0 
end as newSession 
from yourtable yta) baseTable 
GROUP BY website_id, ip