Oracle SQL 组行计数按 10 分钟的时间间隔

Posted

技术标签:

【中文标题】Oracle SQL 组行计数按 10 分钟的时间间隔【英文标题】:Oracle SQL group row count by time intervals of 10 minutes 【发布时间】:2016-04-15 20:32:00 【问题描述】:

我在 oracle 中有一个表,其中包含如下数据

created_date 详细信息 2016 年 1 月 1 日 04:45 abcd 2016 年 1 月 1 日 04:47 2016 年 1 月 1 日 04:53 2016 年 1 月 1 日 04:54 01-Jan-16 04:58 qrst

....等

我希望能够每 10 分钟计算一次表中的行数 例如

时间计数 04:40 2 04:50 3

创建日期 = 时间戳, 详细信息 = varchar

我该怎么做?

谢谢

【问题讨论】:

您是否想要特定日期/时间范围的这些结果,其中 0 值的间隔没有任何匹配,或者您想要所有时间但只有至少有一个匹配的范围? 另外,如果您有 01-Jan-16 04:4502-Jan-16 04:46,您是否希望在单个 04:40 行中看到 2 的计数,或者您希望在 04:40 行中有单独的每天? 【参考方案1】:

如果您想根据实际时间戳值进行分组,这里有一个解决方案:

create table test_10_minutes_group_by (created_date timestamp, details varchar2(4));

insert into test_10_minutes_group_by values (systimestamp, 'aaa'); -- current time
insert into test_10_minutes_group_by values (systimestamp - 1/24/60, 'bbb'); -- 1 minute ago
insert into test_10_minutes_group_by values (systimestamp - 1/24/60 * 10, 'ccc'); -- 10 minutes ago
insert into test_10_minutes_group_by values (systimestamp - 1/24/60 * 20, 'ccc2'); -- 20 minutes ago
insert into test_10_minutes_group_by values (systimestamp - 1/24/60 * 25, 'abc');  -- 25 minutes ago
insert into test_10_minutes_group_by values (systimestamp - 1/24/60 * 30, 'xyz'); -- 30 minutes ago
insert into test_10_minutes_group_by values (systimestamp - 1/24/60 * 35, 'xyz2'); -- 35 minutes ago

select 
    actual_time,
    to_char(actual_time, 'hh24:mi:ss') pretty_date,
    count(1)
  from (
    select 
        trunc(created_date, 'mi') /*remove seconds*/ -  1/24/60 * mod(extract (minute from created_date), 10) /*substract units digit from minutes*/ actual_time, 
        details
      from 
        test_10_minutes_group_by 
  ) 
  group by actual_time;

【讨论】:

【参考方案2】:

答案是:

select trunc(sysdate, 'hh')+ trunc(to_char(sysdate,'mi')/10)*10/1440 from dual;

您可以将 sysdate 替换为您的实际日期/时间戳列,并使用您的表格替换为双列

要了解组件,请运行:

select trunc(sysdate, 'hh') the_hour,
   to_char(sysdate,'mi') the_minutes,
   trunc(to_char(sysdate,'mi')/10)*10 minutes_truncated,
   trunc(to_char(sysdate,'mi')/10)*10/1440 part_of_the_day, --as 1 represents a day in oracle datetime system
   trunc(sysdate, 'hh')+ trunc(to_char(sysdate,'mi')/10)*10/1440 result
from dual;

【讨论】:

【参考方案3】:

您可以使用 TO_CHAR 和 SUBSTR 来构建时间字符串:

select
  substr(to_char(created_date, 'hh24:mi'), 1, 4) || '0' as created,
  count(*)
from mytable
group by substr(to_char(created_date, 'hh24:mi'), 1, 4) || '0'
order by substr(to_char(created_date, 'hh24:mi'), 1, 4) || '0';

或者用一个子查询(一个派生表),这样日期表达式只需要写一次:

select created, count(*)
from
(
  select substr(to_char(created_date, 'hh24:mi'), 1, 4) || '0' as created
  from mytable
)
group by created
order by created;

【讨论】:

【参考方案4】:

一种方法是提取小时和分钟并进行算术:

select extract(hour from created_date) as hh,
       floor(extract(minute from created_date) / 6) as min,
       count(*)
from t
group by extract(hour from created_date),
         floor(extract(minute from created_date) / 6)

【讨论】:

以上是关于Oracle SQL 组行计数按 10 分钟的时间间隔的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle SQL 中按时间间隔聚合数据

Oracle SQL 查询计数组按时间戳子串

如何在一组行之后或有条件地在没有 PL/SQL 块的情况下增加 oracle 序列?

在 MySQL 中聚合/分组一组行/记录

Hive SQL,在滑动 10 分钟窗口中找到最大计数

oracle按每个10分钟进行分组展示数据