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

我想避免将整个表连接到自身,并且可能使用边表或分析函数(过度分区)。

4

1 回答 1

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,从文档的角度来看,这是一个非常糟糕的名称。

于 2012-11-25T19:46:19.223 回答