2013-10-08 21 views
0

嘗試搜索沒有運氣,也許我只是沒有使用正確的術語。無論如何,我有一個PostgreSQL數據庫8.1(紅移),其中數據的樣本是這樣工作的:爲數據庫中的行分配訪問號碼?

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數到anaylze性能誰進來的時候VS那些來到至少低NOx量的參觀者。但是,我不知道如何在第一次,第二次和第三次訪問時分別表現,特別是當用戶可以訪問1-50,000次時。

因此,我想回答一個示例問題,對於至少訪問過10次的用戶,他們在前5次訪問或第2次訪問時表現更好嗎?

非常感謝意見,這個網站是美好的。

謝謝。

+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/