将时间间隔在3秒以下的数据汇总。

TLJewel 2011-03-22 05:02:18
一组时间,如果两个时间间隔小于3秒,就认为他们是一组数据,并计算出数量。

create table aa (datetime date)

insert into aa(datetime) values(to_date('2011-3-22 12:00:01','YYYY-MM-DD HH24:MI:SS'));
insert into aa(datetime) values(to_date('2011-3-22 12:00:02','YYYY-MM-DD HH24:MI:SS'));
insert into aa(datetime) values(to_date('2011-3-22 12:00:03','YYYY-MM-DD HH24:MI:SS'));
insert into aa(datetime) values(to_date('2011-3-22 12:00:11','YYYY-MM-DD HH24:MI:SS'));
insert into aa(datetime) values(to_date('2011-3-22 12:00:12','YYYY-MM-DD HH24:MI:SS'));
insert into aa(datetime) values(to_date('2011-3-22 12:00:40','YYYY-MM-DD HH24:MI:SS'));
insert into aa(datetime) values(to_date('2011-3-22 12:00:41','YYYY-MM-DD HH24:MI:SS'));
insert into aa(datetime) values(to_date('2011-3-22 12:00:42','YYYY-MM-DD HH24:MI:SS'));
insert into aa(datetime) values(to_date('2011-3-22 12:00:43','YYYY-MM-DD HH24:MI:SS'));


期望的结果是
count(*)
3
2
4

这个可以做到吗?
...全文
181 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
humanity 2011-03-25
  • 打赏
  • 举报
回复
你都明确要求精确到 3 秒以前,那我猜想它肯定只是出当天的报表数据,数据量应该不会太大。
TLJewel 2011-03-23
  • 打赏
  • 举报
回复
谢谢大家的帮助,这个问题我个人认为是很难解决的,就算解决了,效率也比较低,因为觉得这个问题比较有意思,所以拿上来让大家看看,能不能学到点新的东西。
TLJewel 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 huojianfashe 的回复:]
你说的有问题

SQL code

create table aa (datetime date)

insert into aa(datetime) values(to_date('2011-3-22 12:00:01','YYYY-MM-DD HH24:MI:SS'));
insert into aa(datetime) values(to_date('2011-3-22 12:……
[/Quote]

很明显,一个组,因为时间间隔小于3秒。

lxyzxq2008 2011-03-22
  • 打赏
  • 举报
回复
貌似可以哈
humanity 2011-03-22
  • 打赏
  • 举报
回复
有个 < 好像应该改成 <=
humanity 2011-03-22
  • 打赏
  • 举报
回复
以前花 100 分请 wildwave 写的 SQL 我拿来改了改就出来了。站在巨人的肩膀上啊。


with ab as (
select datetime
, max(datetime) over (order by datetime rows between 1 preceding and 1 preceding) as PREV_VALUE
, row_number() over (order by datetime) as IDX
from aa
)
select min(datetime) as START_VALUE, max(datetime) as END_VALUE, count(*) as CNT
from ab
start with PREV_VALUE is null or datetime > PREV_VALUE + 3/86400
connect by IDX = Prior IDX + 1 and datetime < prior datetime + 3/86400
group by rownum - level
order by START_VALUE
;


START_VALUE END_VALUE CNT
3/22/2011 12:00:01 PM 3/22/2011 12:00:03 PM 3
3/22/2011 12:00:11 PM 3/22/2011 12:00:12 PM 2
3/22/2011 12:00:40 PM 3/22/2011 12:00:43 PM 4

psufnxk2008 2011-03-22
  • 打赏
  • 举报
回复
等着看。
QKForex 2011-03-22
  • 打赏
  • 举报
回复
你说的有问题

create table aa (datetime date)

insert into aa(datetime) values(to_date('2011-3-22 12:00:01','YYYY-MM-DD HH24:MI:SS'));
insert into aa(datetime) values(to_date('2011-3-22 12:00:02','YYYY-MM-DD HH24:MI:SS'));
insert into aa(datetime) values(to_date('2011-3-22 12:00:03','YYYY-MM-DD HH24:MI:SS'));
insert into aa(datetime) values(to_date('2011-3-22 12:00:04','YYYY-MM-DD HH24:MI:SS'));
insert into aa(datetime) values(to_date('2011-3-22 12:00:05','YYYY-MM-DD HH24:MI:SS'));
insert into aa(datetime) values(to_date('2011-3-22 12:00:06','YYYY-MM-DD HH24:MI:SS'));
insert into aa(datetime) values(to_date('2011-3-22 12:00:07','YYYY-MM-DD HH24:MI:SS'));
insert into aa(datetime) values(to_date('2011-3-22 12:00:08','YYYY-MM-DD HH24:MI:SS'));
insert into aa(datetime) values(to_date('2011-3-22 12:00:09','YYYY-MM-DD HH24:MI:SS'));



你看着分几个组呢
humanity 2011-03-22
  • 打赏
  • 举报
回复
只要发现 与 下一条间隔超过 3 秒,就认为它是另一组的?

这好难办啊。
humanity 2011-03-22
  • 打赏
  • 举报
回复
楼主给出的例子有缺陷,如果连接 6 条记录彼此之间都只间隔 1 秒怎么处理?
gelyon 2011-03-22
  • 打赏
  • 举报
回复

--这个问题如果要用单纯的SQL来解决,可能要参考Oracle model来做
--要不然你只好用PLSQL过程控制来一笔一笔游标判断再做
yanran_hill 2011-03-22
  • 打赏
  • 举报
回复
说一下俺的思路:首先找出时间最小的纪录MinDate,并计算每条纪录Datetime与MinDate的差值
select datetime-(select min(datetime) from aa) from aa
这是一个浮点数,乘以24*60*60取整数就表示每条记录与MinDate相差的秒数了,再把这个数字除以3取整数,然后按照计算后的数字分组,取count()就是结果了

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧