【问题标题】:Divide time period into partitions and calculate averages将时间段划分为多个分区并计算平均值
【发布时间】:2015-08-06 13:55:33
【问题描述】:

我必须将一个进程的经过时间划分为大小相等的槽,并计算每个时间槽内插入的行数。

这是表的 DDL

  ID                  number
  insert_date_time    date

样本数据

    101          Aug 1 2015 4:43:00 PM
    931          Aug 1 2015 4:43:01 PM

我要找的输出如下

 Time Slot          Rows Inserted
4:00 pm  - 5:00 pm       103
5:00 pm  - 6:00 pm       95
6:00 pm  - 7:00 pm       643

(为简洁起见,我省略了日期部分)

同样,我必须找出每 100 行花费了多少时间

    0 - 100 rows        4:00pm - 4:43pm
  101 - 200 rows        4:43pm - 5:58pm

我知道 Oracle OLAP 函数可以用于此,但不确定如何?

【问题讨论】:

  • 请说明数据在表格中的表示方式。
  • 记录布局非常简单。只有两列 - ID(编号)和 insert_date_time(日期)
  • 日期不是间隔。请编辑您的问题,而不是 cmets,并显示您的表格的精确示例数据表示。

标签: oracle olap


【解决方案1】:

希望我能理解您的要求。

第一个请求#:

SELECT TO_CHAR(INSERT_TIME,'HH24'),COUNT(*) FROM TABLE
GROUP BY TO_CHAR(INSERT_TIME,'HH24');

第二个请求#:

SELECT ROUND((ROW_NUMBER-1)/100,0),
MIN(INSERT_TIME)      +'-'+ MAX(INSERT_TIME)
FROM TABLE
GROUP BY ROUND((ROW_NUMBER-1)/100,0);

【讨论】:

  • 我更喜欢您在第二个查询中对记录进行分组的方式,而不是我的方式。
【解决方案2】:

如果您正在寻找 1 小时的分区,您可以简单地将您正在查看的日期列截断为小时 trunc(your_date_col, 'hour') 在分组子句中使用该截断值。

对于第二个要求,您可以使用如下查询对行进行分区:

with data as (
select a.your_date_col
     , row_number() over (order by Your_Date_Col) rn
     , row_number() over (order by Your_Date_Col) -
       mod(row_number() over (order by Your_Date_Col)-1,50) grp
  from your_table a
)
select min(rn) ||' - '
     ||max(rn) ||' rows' rows
     , min(your_date_col)||' - '
     ||max(your_date_col) time_range
  from data
 group by grp

【讨论】:

    猜你喜欢
    • 2013-12-19
    • 2021-07-07
    • 2019-02-24
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多