我有一个巨大的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
我想避免加入整个表格 并且可能使用边表或分析函数(过分割)。
答案 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
是一个非常糟糕的名称。