按15分钟间隔的累积总和组-Oracle SQL

按15分钟间隔的累积总和组-Oracle SQL,sql,oracle,group-by,cumulative-sum,Sql,Oracle,Group By,Cumulative Sum,我想以15分钟为间隔得到累积和组。 如: 表格名称:myTable 结果: 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

我想以15分钟为间隔得到累积和组。 如:

表格名称:myTable

结果:

         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
谢谢

我想你想要:

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;
是一把小提琴。

我想你想要:

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;

是一个数据字典。

此查询提供了现有季度的累计金额:

如果您想要更宽的日期范围,请使用connect by query生成该范围,并使用lag with ignore nulls与上面的join with生成该范围,如下所示:

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)

此查询提供了现有季度的累计金额:

如果您想要更宽的日期范围,请使用connect by query生成该范围,并使用lag with ignore nulls与上面的join with生成该范围,如下所示:

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)
您可以使用group by将日期截断为15分钟,然后使用分析函数计算累积和,如下所示:

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
这与戈登的答案相同,但使用的是算术

干杯

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

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
这与戈登的答案相同,但使用的是算术


干杯

您的数据从23:30传播到00:25,但您的结果从23:15传播到01:00。您如何定义结果集的范围?paolo ricardos,您可以发布具有匹配源和预期结果的示例数据的任何更改?您的数据从23:30扩展到00:25,但您的结果从23:15扩展到01:00。您如何定义结果集的范围?paolo ricardos,您可以发布具有匹配源和预期结果的示例数据的任何更改?在这两个位置不应该是“*间隔”1分钟?现在,分钟移动到秒+1无论如何。@Poundstibbons。非常感谢。这一点你当然是对的。两个地方的间隔时间不应该都是1分钟吗?现在,分钟移动到秒+1无论如何。@Poundstibbons。非常感谢。你当然是对的。