大表中行之间的时差

时间:2012-11-25 18:50:43

标签: sql postgresql bigdata

我有一个巨大的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

我想避免加入整个表格 并且可能使用边表或分析函数(过分割)。

1 个答案:

答案 0 :(得分: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上的索引)

顺便说一下:用保留字(date)命名列不是一个好主意。另外,从文档的角度来看,date是一个非常糟糕的名称。