最大日期间隔的分析函数范围窗口

Posted

技术标签:

【中文标题】最大日期间隔的分析函数范围窗口【英文标题】:Analytical function range window for max date interval 【发布时间】:2015-01-08 14:00:11 【问题描述】:

我正在尝试从每个组或分区的最新日期获取 10 分钟的间隔数据。

伪代码SQL:

Select
count(1) Over( partition by col1, col2, col3 
               Order by Col_Date Desc 
               Range Max(Col_Date) Between  Max(Col_Date) - 10(24*60) ) col_upd
From 
Table_1;

超出此特定范围的值将需要分配编号以设置删除。

2014-01-05 01:20:00  -- Max date 
2014-01-05 01:15:13
2014-01-05 01:12:13
2014-01-05 01:07:13  -- 1) these last two rows should be set for
2014-01-05 01:06:13  -- 2) delete or assign same id

有没有分析函数的方法来解决这个问题?

【问题讨论】:

【参考方案1】:

你没有给出表结构,但如果我组成一个虚拟表,比如:

create table t42 (id number, grp_id number, dt date);

insert into t42 values (1, 1, timestamp '2014-01-05 01:20:00'); 
insert into t42 values (2, 1, timestamp '2014-01-05 01:15:13');
insert into t42 values (3, 1, timestamp '2014-01-05 01:12:13');
insert into t42 values (4, 1, timestamp '2014-01-05 01:07:13');
insert into t42 values (5, 1, timestamp '2014-01-05 01:06:13');

那么这将为您提供组中每一行与其(分析)最大值相比的年龄:

select grp_id, id, dt, max(dt) over (partition by grp_id) - dt as age
from t42
order by id;

    GRP_ID         ID DT                           AGE
---------- ---------- ------------------- ------------
         1          1 2014-01-05 01:20:00            0 
         1          2 2014-01-05 01:15:13 .00332175926 
         1          3 2014-01-05 01:12:13 .00540509259 
         1          4 2014-01-05 01:07:13 .00887731481 
         1          5 2014-01-05 01:06:13 .00957175926 

您可以将其用作内部查询并过滤掉最长 10 分钟的记录:

select grp_id, id, dt
from (
  select grp_id, id, dt, max(dt) over (partition by grp_id) - dt as age
  from t42
)
where age > (10*60)/(24*60*60)
order by id;

   GRP_ID         ID DT                
---------- ---------- -------------------
         1          4 2014-01-05 01:07:13 
         1          5 2014-01-05 01:06:13 

然后您可以根据需要使用这些删除/更新。从您的问题中不清楚您的组/分区是否已经从内部查询中计算出来;如果是这样,您可以使用它而不是我的t42 表。 (当然是更改列名等)。

【讨论】:

以上是关于最大日期间隔的分析函数范围窗口的主要内容,如果未能解决你的问题,请参考以下文章

从两组日期范围 C# 中查找间隔日期范围

在日期范围内按日期聚合数据,结果集中没有日期间隔

presto计算日期间隔天数或者小时间隔——date_diff函数使用

分组日期之间的间隔

范围连接 data.frames - R 中具有日期范围/间隔的特定日期列

pandas使用date_range函数以及datetime函数创建从当前时间为起始时间间隔为天的指定长度时间范围(periods)的时间序列数据设置normalize参数只保留日期信息