2012-11-25 22 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