选择 2 个日期之间的记录平均值 SQL Netezza

Posted

技术标签:

【中文标题】选择 2 个日期之间的记录平均值 SQL Netezza【英文标题】:Select Average of records between 2 dates SQL Netezza 【发布时间】:2021-02-02 21:30:04 【问题描述】:

我有 2 个表,第一个名为 Activations,并且有两列:Line_ID、Activation_Date。 第二个名为 Speed 的表有列:Line_ID、From_Date、To_Date、Record。

第一个表示例:

|Line_ID| Activation_Date|
|-------+----------------|
|123456 | 1-Jan          |
|345678 | 2-Jan          |
|987654 | 3-Jan          |
...

第二个缺口和孤岛表:

|Line_ID|From_Date| To_Date |Speed|
|-------+---------+---------+-----|  
|123456 |1-Jan    |4-Jan    |70   |
|123456 |4-Jan    |7-Jan    |51   |
|123456 |7-Jan    |10-Jan   |48   |
|123456 |10-Jan   |15-Jan   |40   |
|123456 |15-Jan   |17-Jan   |70   |
|123456 |17-Jan   |19-Jan   |54   |
|123456 |19-Jan   |21-Jan   |94   |
|123456 |21-Jan   |28-Jan   |91   |
|123456 |28-Jan   |31-Jan   |35   |
...

我需要将 Activation 表与 Records 表连接起来,以向 Activation 表中添加 4 列,但有一些顾虑,

第一个:从 Activation_Date 开始的前 7 天记录的平均速度。 第 2 次:记录从 Activation_Date 开始的第二个 7 天的平均速度。 3ed:从 Activation_Date 开始,记录的第三个 7 天的平均速度。 第 4 天:记录从 Activation_Date 开始的第 4 个 7 天的平均速度。

结果将如下所示

|Line_ID| Activation_Date|AVG_SPEED_Week1|AVG_SPEED_Week2|AVG_SPEED_Week3|AVG_SPEED_Week4|
|-------+----------------+---------------+---------------+---------------+---------------|
|123456 | 1-Jan          |60.5           |44             |72.6           |91             |
...

结果探索

AVG_SPEED_Week1: Average of Speed in the 1st 7 days starting Records.From_Date: 1-Jan Records.To_Date: 7-Jan
AVG_SPEED_Week2: Average of Speed in the 2nd 7 days starting Records.From_Date: 8-Jan Records.To_Date: 14-Jan
AVG_SPEED_Week3: Average of Speed in the 2nd 7 days starting Records.From_Date: 15-Jan Records.To_Date: 21-Jan
AVG_SPEED_Week4: Average of Speed in the 2nd 7 days starting Records.From_Date: 22-Jan Records.To_Date: 28-Jan

【问题讨论】:

第二张表看不懂。持续时间总是一天吗? @GordonLinoff 我已将第二个表格的示例编辑为间隙和岛屿 【参考方案1】:

我会扩展数据并汇总:

with s as (
      select s.*, s.from_date + n.idx * interval '1 day' as dte
      from speed s join
           _V_VECTOR_IDX n
           on s.to_date <= s.from_date + n.idx * interval '1 day'
     )
select a.line_id,
       avg(case when s.dte between a.activation_date and a.activation_date + interval '6 day' then s.speed end),
       avg(case when s.dte between a.activation_date  + interval '7 day' and a.activation_date + interval '13 day' then s.speed end),
       avg(case when s.dte between a.activation_date  + interval '14 day' and a.activation_date + interval '20 day' then s.speed end),
       avg(case when s.dte between a.activation_date + interval '21 day' and a.activation_date + interval '27 day' then s.speed end)
from activations a left join
     s
     on a.line_id = s.line_id
group by a.line_id, a.activation_date;

这假设时间段少于 1000 天左右。

【讨论】:

我应用了上述代码,但它没有给我真正的结果。如果 Line_ID 的 Active_Date 是 2020-08-19,那么第一个 AVG 的 From_Date 和 To_Date 是什么?以及为什么 DTE 列在 From_Date 之后 2 天 @AhmedAbdelkader 。 . .我的理解是,这应该做你想要的,但也许你需要增加或减少一天才能得到确切的结果。【参考方案2】:

我无法测试它,但那怎么样?:

SELECT a.Line_ID
,a.Activation_Date 
,CASE WHEN a.Activation_Date >= s.From_Date AND a.Activation_Date <= s.To_Date AND DATEADD(day,-7,s.To_Date) >= a.Activation_Date THEN AVG(SUM(s.Speed)) END AVG_SPEED_Week1
,CASE WHEN a.Activation_Date >= s.From_Date AND a.Activation_Date <= s.To_Date AND DATEADD(day,-14,s.To_Date) >= a.Activation_Date AND DATEADD(day,-7,s.From_Date) >= a.Activation_Date THEN AVG(SUM(s.Speed)) END AVG_SPEED_Week2
,CASE WHEN a.Activation_Date >= s.From_Date AND a.Activation_Date <= s.To_Date AND DATEADD(day,-21,s.To_Date) >= a.Activation_Date AND DATEADD(day,-14,s.From_Date) >= a.Activation_Date THEN AVG(SUM(s.Speed)) END AVG_SPEED_Week3
,CASE WHEN a.Activation_Date >= s.From_Date AND a.Activation_Date <= s.To_Date AND DATEADD(day,-28,s.To_Date) >= a.Activation_Date AND DATEADD(day,-21,s.From_Date) >= a.Activation_Date THEN AVG(SUM(s.Speed)) END AVG_SPEED_Week4
FROM Activations a
JOIN Speed s 
ON a.Line_ID=s.Line_ID
GROUP BY a.Line_ID, a.Activation_Date

我假设您不需要动态计算并生成任意周数的平均速度,4 周就足够了。

它肯定需要测试。

【讨论】:

以上是关于选择 2 个日期之间的记录平均值 SQL Netezza的主要内容,如果未能解决你的问题,请参考以下文章

SQL 中 2 个日期之间的 SQL 搜索

如何在sql查询之间使用日期时间的最后一个条目?

sql仅获取这些日期之间的记录[重复]

sql 获取两个2日期之间的记录

使用分析函数选择具有 2 个日期列的记录的高性能查询

如何计算 SQL Server 中按日期和用户分组的条目之间的平均时间?