2012-11-25 70 views
0

我有一個巨大的sql表(超過10億)用戶事務。
我想添加一個二進制列,它表示當前user_id行的位置是否在40分鐘以內。大表中的行之間的時間差異

例如:

user_id | date     
--------+-------------------- 
1  | 2011-01-01 12:15:00 
1  | 2011-01-01 12:00:00 
8  | 2011-01-01 15:00:00 
8  | 2011-01-01 14:00:00 

查詢的結果將是:

user_id | date    | new 
--------+---------------------+---- 
1  | 2011-01-01 12:15:00 | 0 
1  | 2011-01-01 12:00:00 | 1 
8  | 2011-01-01 15:00:00 | 1 
8  | 2011-01-01 14:00:00 | 1 

我想避免加入整個表本身 ,也許用一個邊桌或分析功能(over-partition)。

回答

3
select user_id, 
     date, 
     case 
      when date - lag(date) over (partition by user_id order by date) > interval '40' minute then 1 
      else 0 
     end as diff_flag 
from the_table 
order by user_id, date 

它假設date是一個時間戳列,儘管它的名稱。

這是我能看到的唯一途徑。 (user_id,date)上的索引可能會加快速度 - 特別是在9.2中,這可能有資格進行僅索引掃描。但是,這是掃描整個表(或也許只有在9.2的指數)

BTW:這不是一個好主意來命名一個保留字(date)列。另外date從文檔的角度來看是一個非常糟糕的名字。

+0

非常感謝,它看起來完全像我尋找的解決方案! 當然,我接受你的評論,列的真名是req_timestamp,爲了這個問題我簡化了它。 – gilibi