sql 时间段分组统计查询
SQLsever2008数据库,请问各位江湖大侠,请指点:假如我有几百万条如下数据,我需要按时间段分组(今天10:00-明天10:00)统计有多少订单量该怎么写sql?前...
SQL sever 2008 数据库,请问各位江湖大侠,请指点:假如我有几百万条如下数据,我需要按时间段分组(今天10:00 - 明天10:00) 统计有多少订单量该怎么写sql?前提是按(今天10:00 - 明天10:00)为一组,数据举例如下:
订单(int) 时间(string)
订单1 2013/3/1 0:23
订单2 2013/3/2 0:23
订单3 2013/3/3 1:23
订单4 2013/3/4 0:23
订单5 2013/3/5 0:53
订单6 2013/3/6 0:23
订单7 2013/3/7 7:23
订单8 2013/3/8 0:23
订单9 2013/3/9 0:23
订单10 2013/3/10 0:23
订单11 2013/3/11 0:23
订单12 2013/3/12 8:23
订单13 2013/3/13 0:23
订单14 2013/3/14 0:23
订单15 2013/3/15 0:23
订单16 2013/3/16 0:23
订单17 2013/3/17 0:33
订单18 2013/3/18 0:23
订单19 2013/3/19 0:23
订单20 2013/3/20 0:12 ..... 展开
订单(int) 时间(string)
订单1 2013/3/1 0:23
订单2 2013/3/2 0:23
订单3 2013/3/3 1:23
订单4 2013/3/4 0:23
订单5 2013/3/5 0:53
订单6 2013/3/6 0:23
订单7 2013/3/7 7:23
订单8 2013/3/8 0:23
订单9 2013/3/9 0:23
订单10 2013/3/10 0:23
订单11 2013/3/11 0:23
订单12 2013/3/12 8:23
订单13 2013/3/13 0:23
订单14 2013/3/14 0:23
订单15 2013/3/15 0:23
订单16 2013/3/16 0:23
订单17 2013/3/17 0:33
订单18 2013/3/18 0:23
订单19 2013/3/19 0:23
订单20 2013/3/20 0:12 ..... 展开
展开全部
有点点麻烦,需要先构建一个关于时间段的虚表
先找到你订单的最早的时间,然后找一个行数足够多的表
假设你的表名叫s,也就是你罗列出数据这个表
with t as
(select row_number() over (order by id)-1 rn from sheet2)--sheet2替换成你行数足够多的表,还有order by id里的id你随便替换你表里的一个字段
select dateadd(hour,10+24*t.rn,cast('2013/3/1' as datetime)) begin_time,--2013/3/1换成你表里的最小时间
dateadd(hour,10+24*(t.rn+1),cast('2013/3/1' as datetime)) end_time,
count(*) 订单数量
from t,s--这个s替换成你自己的表名
where cast(s.时间)>=dateadd(hour,10+24*t.rn,cast('2013/3/1' as datetime))
and cast(s.时间)<dateadd(hour,10+24*(t.rn+1),cast('2013/3/1' as datetime))
展开全部
没用过sqlserver,都是oracle,mysql。不过原理上应该都是一样的。
首选时间字段列拆成两列 日期(date) 和小时(hour),都是数字型 这是第一层sql,比如2013/3/3 1:23 拆成
20130303 1 ,2013/3/3 11:23 拆成 20130303 11。 然后奖这两列再合成一个分组列 ,用case when语句 对小时列进行判断,如果小时列小于10,则合并后的分组列 =日期列-1,如果大于10,则+0,sql语句,select date+(case when hour<10 then -1 else 0 end) from 第一层结果。上面的两个例子合并后的分组列分别是 20130302,20130303。最后对分组列group by 就搞定
首选时间字段列拆成两列 日期(date) 和小时(hour),都是数字型 这是第一层sql,比如2013/3/3 1:23 拆成
20130303 1 ,2013/3/3 11:23 拆成 20130303 11。 然后奖这两列再合成一个分组列 ,用case when语句 对小时列进行判断,如果小时列小于10,则合并后的分组列 =日期列-1,如果大于10,则+0,sql语句,select date+(case when hour<10 then -1 else 0 end) from 第一层结果。上面的两个例子合并后的分组列分别是 20130302,20130303。最后对分组列group by 就搞定
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我觉得可以这样。比较清晰。其实你这个说白了就是按天分组而已,只不过是时间上是10点。
可以先将数据的时间列都减少10小时,再按天分组。
select DATEPART(YYYY,T.newDate),DATEPART(MM,T.newDate),DATEPART(DD,T.newDate),COUNT(*) from
(
select Id,DATEADD(HOUR,-10,orderdate) as newDate from [table]
) as T
group by DATEPART(YYYY,T.newDate),DATEPART(MM,T.newDate),DATEPART(DD,T.newDate)
可以先将数据的时间列都减少10小时,再按天分组。
select DATEPART(YYYY,T.newDate),DATEPART(MM,T.newDate),DATEPART(DD,T.newDate),COUNT(*) from
(
select Id,DATEADD(HOUR,-10,orderdate) as newDate from [table]
) as T
group by DATEPART(YYYY,T.newDate),DATEPART(MM,T.newDate),DATEPART(DD,T.newDate)
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询