大表中的行之间的时间差
Posted
技术标签:
【中文标题】大表中的行之间的时间差【英文标题】:Time diffence between rows in a big table 【发布时间】:2012-11-25 18:50:42 【问题描述】:我有一个巨大的 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】: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
是一个非常糟糕的名称。
【讨论】:
非常感谢,它看起来与我正在寻找的解决方案一模一样!我当然接受你的说法,该列的真实名称是req_timestamp,我只是为了这个问题而简化了它。以上是关于大表中的行之间的时间差的主要内容,如果未能解决你的问题,请参考以下文章