为数据库中的行分配访问号码?

时间:2013-10-08 15:51:28

标签: sql postgresql

试着搜索没有运气,也许我只是没有使用正确的术语。无论如何,我正在使用postgresql 8.1数据库(redshift),其中数据样本如下所示:

User ID   Timestamp    Visit ID
1         05:20:20am   10
2         05:21:00am   11
1         05:22:14am   12
1         05:24:09am   13

假设这是一个非常基本的数据样本。我想分析人们在第一次访问,第二次访问,第三次访问等时如何处理其他指标。我能想到的最简单的方法是创建一个单独的表,如下所示:

Visit ID    Visit Number
10          1
11          1
12          2 
13          3 

或以某种方式附加到我原来的表格中:

User ID   Timestamp    Visit ID    Visit Number
1         05:20:20am   10          1
2         05:21:00am   11          1 
1         05:22:14am   12          2
1         05:24:09am   13          3

我知道我可以使用groupby并计算那些至少来过x次的访问者和那些少来的访问者的性能分析。但是,我不知道如何在第一次,第二次,第三次访问时分析性能,特别是当用户可以访问1-50,000次时。

这是一个我想回答的示例问题...对于访问至少10次的用户,他们在前5次访问或第5次访问中表现更好吗?

非常感谢这个建议,这个网站很精彩。

感谢。

1 个答案:

答案 0 :(得分:1)

一个(可能很慢)选项是使用相关子查询:

SELECT  t.UserID, 
        t.Timestamp, 
        t.VisitID,
        (   SELECT  COUNT(*) + 1
            FROM    T T2
            WHERE   T2.UserID = T.UserID
            AND     T2.TimeStamp < T.TimeStamp
        ) VisitNumber
FROM    T;

<强> Example on SQL Fiddle

最简单(尽管可能不可行)的解决方案是升级到Postgresql 8.4或更高版本并利用ROW_NUMBER:

SELECT  t.UserID, 
        t.Timestamp, 
        t.VisitID,
        ROW_NUMBER() OVER(PARTITION BY t.UserID ORDER BY t.Timestamp) AS VisitNumber
FROM    T;

<强> Example on SQL Fiddle

最后,如果第一个查询太慢,并且升级不是一个选项,下面的文章将详细介绍另一个选项。我不知道这会如何表现。

http://www.depesz.com/2007/08/17/rownum-anyone-cumulative-sum-in-one-query/