我有一张表格,其中包含有关我们网站访问者的信息。
所以它看起来像
VISITOR_ID EVENT Date Rank
(我已根据事件对他们进行了排名)
Visitor_id Event Date rank
1 visit 1/1/14 1
1 purchase 1/2/14 2
1 visit 1/3/14 3
1 visit 1/4/14 4
1 purchase 1/5/14 5
1 visit 1/6/14 6
1 visit 1/7/14 7
1 visit 1/8/14 8
1 purchase 1/9/14 9
我想查找所有最短和最长访问日期(因此每次购买每个用户之前的第一次和最后一次访问) 在每次购买之前,结果应该有日期
visitor mindate maxdate
1 1/1/2014 1/1/2014 (in this scenario there was only one visit before a purchase)
1 1/3/2014 1/4/2014 ( 2 OR MORE VISITS BEFORE A PURCHASE)
1 1/6/2014 1/8/2014
这只是一位访客的一个例子。该表有大约一百万访客。请帮忙。
答案 0 :(得分:1)
您需要将访问分组。你可以用一个简单的技巧来做到这一点。如果您枚举访问行并从排名中减去,则每个组都将具有常量值。所以,这很简单:
select visitor, min(date) as mindate, max(date) as maxdate
from (select t.*, row_number() over (partition by visitor order by rank) as v_rank
from table t
where event = 'Visit'
) t
group by visitor, (rank - v_rank);
答案 1 :(得分:0)
这是另一种选择:
SELECT
visitor_id
, MIN(Date)
, MAX(Date)
FROM
visitors v
INNER JOIN
(SELECT
rank
FROM visitors
WHERE Event = 'purchase' AND v.visitor_id = visitors.visitor_id) purchases
WHERE v.rank < purchases.rank
GROUP BY v.visitor_id, v.rank;