大表中的行之间的时间差

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,我只是为了这个问题而简化了它。

以上是关于大表中的行之间的时间差的主要内容,如果未能解决你的问题,请参考以下文章

使用大表连接更新 Amazon Redshift 中的列

在 SQLite3 表中的行上有效地执行 python 代码

MySQL - 从大表中选择随机行

PostgreSQL大表的更新时间

使用laravel从大表中删除重复项[关闭]

Excel函数在大表中查找重复行