Mik*_*ike 5 sql oracle time grouping intervals
我想按时间间隔对表中的数据进行分组.该表保留包含用户ID,项目名称,型号,数量,活动日期等的订单信息.现在,我想按时间间隔对此数据进行分组.时间间隔可以是5分钟,10分钟,15等等.此外,查询应仅返回在该5分钟间隔内多次发出命令的那些用户(所有列数据).是否可以在一个SQL查询中实现此目的?我使用Oracle.
谢谢
编辑:
样本数据
**userid item name model quantity order date**
abc calculator cdm83ss 1 02-FEB-2013 09:20:13
abc alarm clock actp001 1 02-FEB-2013 09:26:22
yyy iPhone iP4 1 02-FEB-2013 09:28:14
abc alarm clock actz321 2 02-FEB-2013 09:30:00
zzz backpack bp344tk 1 04-FEB-2013 13:15:00
zzz backpack bp234zz 2 04-FEB-2013 13:19:32
zzz camera cm234 1 04-FEB-2013 13:20:22
ttt tv fs45yup 1 04-FEB-2013 13:28:19
Run Code Online (Sandbox Code Playgroud)
我希望得到:
**userid item name model quantity order date**
abc calculator cdm83ss 1 02-FEB-2013 09:20:13
abc alarm clock actp001 1 02-FEB-2013 09:26:22
abc alarm clock actz321 2 02-FEB-2013 09:30:00
zzz backpack bp344tk 1 04-FEB-2013 13:15:00
zzz backpack bp234zz 2 04-FEB-2013 13:19:32
zzz camera cm234 1 04-FEB-2013 13:20:22
Run Code Online (Sandbox Code Playgroud)
是.据推测,您希望将结果视为日期时间值.这需要一些日期时间算法.基本上,获取自午夜以来的分钟数,除以分钟数再乘以(向下舍入).然后在午夜时间加回:
select t.*
from (select t.*,
count(*) over (partition by userid, interval) as CntInInterval
from (select trunc(orderdate)+
(floor(((orderdate - trunc(orderdate))*24*60)/10)*10)/(24*60) as interval, t.*
from t
) t
) t
where cntInInterval > 1
Run Code Online (Sandbox Code Playgroud)
要按时间间隔分组,您可以使用:
select interval, count(*)
from (select trunc(orderdate)+floor(((orderdate - trunc(orderdate))*24*60)/10)*10 as interval, t.*
from t
) t
group by interval
Run Code Online (Sandbox Code Playgroud)
在这些查询中,"10"表示任意分钟数.请注意,这些是从午夜开始计算的,因此像17这样的值始终从当天的前17分钟开始.
interval的定义是日期的算术表达式.
trunc(orderdate)+ floor(((orderdate - trunc(orderdate))*24*60)/ 10)*10作为间隔,
第一部分trunc(orderdate)是Oracle语法,用于删除日期的时间部分.这会将日期移动到当天开始的午夜.
表达式orderdate - trunc(orderdate)计算自午夜以来的天数 - 这是一天的小数部分.所以,0.25将是早上6点.*24*60将此转换为分钟.因此,0.25变为0.25*60*24 = 360 - 自午夜起的分钟数.
然后表达式floor(x/y)*y简单地"截断"任何值到y的下半部分.因此,floor(118/10)是11,并且11*10是110.换句话说,这将把a*y和(a + 1)*y之间的所有值(直到不包括)映射到相同的值a*y.
在2013-01-01上午6:08考虑实践中的表达:
`trunc(orderdate)` moves the date to midnight on 2013-01-01.
`orderdate - trunc(orderdate)` creates a number like 0.25.
`((orderdate - trunc(orderdate))*24*60)` produces the value 368
`floor(((orderdate - trunc(orderdate))*24*60)/10)*10` produces 360
`floor(((orderdate - trunc(orderdate))*24*60)/10)*10*(1/24*60)` produces 0.25
Run Code Online (Sandbox Code Playgroud)
当这个被添加到最后,时间再次变为早上6点.