在每个customerID SQL的特定行之前选择最小值和最大值

时间:2014-04-25 02:21:46

标签: sql postgresql-9.1 netezza gaps-and-islands

我有一张表格,其中包含有关我们网站访问者的信息。

所以它看起来像

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 

这只是一位访客的一个例子。该表有大约一百万访客。请帮忙。

2 个答案:

答案 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;