【问题标题】:Cumulative sum group by 15 min interval - Oracle SQL按 15 分钟间隔的累积和组 - Oracle SQL
【发布时间】:2020-04-10 03:49:46
【问题描述】:

我想以 15 分钟的间隔获取累积总和组。
例如:

表名:myTable

   id    name        start_time        faults
    ============================================
    1     a        06/07/19 23:30        1
    2     b        06/07/19 23:35        1
    3     c        06/07/19 23:36        1
    4     d        06/07/19 23:50        1
    5     e        06/07/19 23:54        1 
    6     f        07/07/19 00:05        1
    7     g        07/07/19 00:20        1
    8     h        07/07/19 00:25        1

结果:

         start_Time         faults
  ============================================
        06/07/19 23:15        0  
        06/07/19 23:30        3
        06/07/19 23:45        5
        06/07/19 00:00        6
        07/07/19 00:15        8
        07/07/19 00:30        8 
        08/07/19 00:45        8
        08/07/19 01:00        8

谢谢

【问题讨论】:

  • 您的数据从 23:30 传播到 00:25,但您的结果从 23:15 传播到 01:00。如何定义结果集的范围?
  • paolo ricardos,您可以发布具有匹配源和预期结果的示例数据的任何更改吗?

标签: sql oracle group-by cumulative-sum


【解决方案1】:

我想你想要:

select trunc(start_time, 'hh') + (floor(extract(minute from start_time) / 15) * 15) * interval '1' minute as dte,
       sum(count(*)) over (order by min(start_time))
from t
group by trunc(start_time, 'hh') + (floor(extract(minute from start_time) / 15) * 15) * interval '1' minute
order by dte;

Here 是一个 dbfiddle。

【讨论】:

  • 两个地方都不应该是` * interval '1' minute `?现在分钟移动到秒。无论如何 +1。
  • @PonderStibbons 。 . .谢谢你。你当然是正确的。
【解决方案2】:

您可以使用 group by 将日期截断为 15 分钟,然后使用 analytical function 计算累积和,如下所示:

Select 
    start_time 
    + 15/1440 
    - mod((start_time - trunc(start_time)) * 1440, 15)/1440,
    sum(count(1)) over (order by min(start_time))
from your_table
Group by start_time 
    + 15/1440 
    - mod((start_time - trunc(start_time)) * 1440, 15)/1440

这与戈登的答案相同,但使用算术。 :)

干杯!!

【讨论】:

    【解决方案3】:

    此查询给出现有季度的累积总和:

    dbfiddle

    select date '1900-01-01' + tm / 24 / 4 tm, sum(sum(faults)) over (order by tm) faults
      from (select floor((start_time - date '1900-01-01') * 24 * 4) tm, faults from mytable)
      group by tm
    

    如果您想要更宽的日期范围,请使用connect by 查询生成它,并使用lag()ignore nulls 加入上面,如下所示:

    with 
      flts as (
        select date '1900-01-01' + tm / 24 / 4 tm, sum(sum(faults)) over (order by tm) faults
          from (select floor((start_time - date '1900-01-01') * 24 * 4) tm, faults from mytable)
          group by tm),
      quarters as (
        select to_date('2019-07-06 23:00', 'yyyy-mm-dd hh24:mi') + level * interval '15' minute tm 
          from dual connect by level <= 10 )
    select to_char(tm, 'yyyy-mm-dd hh24:mi') tm, 
           nvl(faults, lag(faults, 1, 0) ignore nulls over (order by tm))
      from quarters left join flts using (tm)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-21
      • 1970-01-01
      相关资源
      最近更新 更多