如何按照时间段分组?

veardn 2009-03-04 10:40:46
有个sql语句
select distinct a.item_id,b.type_name,c.data_value,c.data_time
from t_data_item a,t_data_type b,t_data c
where a.station_id=1211
and a.type_id=b.type_id
and a.item_id=c.item_id
and b.type_name like '%瞬时流量%'
and c.data_time>=to_date('2009-03-02 00:00:00','yyyy-mm-dd hh24:mi:ss')
and c.data_time<to_date('2009-03-03 00:00:00','yyyy-mm-dd hh24:mi:ss')
order by c.data_time


查询结果如下:
itemid itemname datavalue datetime
1 4011 瞬时流量测试项 0.0000 2009-3-2
2 4011 瞬时流量测试项 0.0000 2009-3-2 0:15:00
3 4011 瞬时流量测试项 0.0000 2009-3-2 0:30:00
4 4011 瞬时流量测试项 0.0000 2009-3-2 0:45:00
5 4011 瞬时流量测试项 0.0000 2009-3-2 1:00:00
6 4011 瞬时流量测试项 0.0000 2009-3-2 1:15:00
7 4011 瞬时流量测试项 0.0000 2009-3-2 1:30:00
8 4011 瞬时流量测试项 0.0000 2009-3-2 1:45:00
9 4011 瞬时流量测试项 8.0000 2009-3-2 2:00:00
10 4011 瞬时流量测试项 12.0000 2009-3-2 2:15:00
11 4011 瞬时流量测试项 16.0000 2009-3-2 2:30:00
12 4011 瞬时流量测试项 4.0000 2009-3-2 2:45:00
13 4011 瞬时流量测试项 16.0000 2009-3-2 3:00:00
14 4011 瞬时流量测试项 16.0000 2009-3-2 3:15:00
15 4011 瞬时流量测试项 4.0000 2009-3-2 3:30:00
16 4011 瞬时流量测试项 16.0000 2009-3-2 3:45:00
17 4011 瞬时流量测试项 12.0000 2009-3-2 4:00:00
18 4011 瞬时流量测试项 8.0000 2009-3-2 4:15:00
19 4011 瞬时流量测试项 16.0000 2009-3-2 4:30:00
20 4011 瞬时流量测试项 4.0000 2009-3-2 4:45:00
21 4011 瞬时流量测试项 16.0000 2009-3-2 5:00:00
22 4011 瞬时流量测试项 16.0000 2009-3-2 5:15:00
23 4011 瞬时流量测试项 4.0000 2009-3-2 5:30:00
24 4011 瞬时流量测试项 16.0000 2009-3-2 5:45:00
25 4011 瞬时流量测试项 0.0000 2009-3-2 6:00:00
26 4011 瞬时流量测试项 0.0000 2009-3-2 6:15:00
27 4011 瞬时流量测试项 20.0000 2009-3-2 6:30:00
28 4011 瞬时流量测试项 8.0000 2009-3-2 6:45:00
29 4011 瞬时流量测试项 12.0000 2009-3-2 7:00:00
30 4011 瞬时流量测试项 16.0000 2009-3-2 7:15:00
31 4011 瞬时流量测试项 4.0000 2009-3-2 7:30:00
32 4011 瞬时流量测试项 16.0000 2009-3-2 7:45:00
33 4011 瞬时流量测试项 16.0000 2009-3-2 8:00:00
34 4011 瞬时流量测试项 0.0000 2009-3-2 8:15:00
35 4011 瞬时流量测试项 0.0000 2009-3-2 8:30:00
36 4011 瞬时流量测试项 12.0000 2009-3-2 8:45:00
37 4011 瞬时流量测试项 8.0000 2009-3-2 9:00:00
38 4011 瞬时流量测试项 20.0000 2009-3-2 9:15:00
39 4011 瞬时流量测试项 4.0000 2009-3-2 9:30:00
40 4011 瞬时流量测试项 12.0000 2009-3-2 9:45:00
41 4011 瞬时流量测试项 20.0000 2009-3-2 10:00:00
42 4011 瞬时流量测试项 0.0000 2009-3-2 10:15:00
43 4011 瞬时流量测试项 0.0000 2009-3-2 10:30:00
44 4011 瞬时流量测试项 20.0000 2009-3-2 10:45:00
45 4011 瞬时流量测试项 4.0000 2009-3-2 11:00:00
46 4011 瞬时流量测试项 12.0000 2009-3-2 11:15:00
47 4011 瞬时流量测试项 20.0000 2009-3-2 11:30:00
48 4011 瞬时流量测试项 0.0000 2009-3-2 11:45:00
49 4011 瞬时流量测试项 20.0000 2009-3-2 12:00:00
50 4011 瞬时流量测试项 12.0000 2009-3-2 12:15:00
51 4011 瞬时流量测试项 4.0000 2009-3-2 12:30:00
52 4011 瞬时流量测试项 20.0000 2009-3-2 12:45:00
53 4011 瞬时流量测试项 0.0000 2009-3-2 13:00:00
54 4011 瞬时流量测试项 0.0000 2009-3-2 13:15:00
55 4011 瞬时流量测试项 16.0000 2009-3-2 13:30:00
56 4011 瞬时流量测试项 12.0000 2009-3-2 13:45:00
57 4011 瞬时流量测试项 12.0000 2009-3-2 14:00:00
58 4011 瞬时流量测试项 20.0000 2009-3-2 14:15:00
59 4011 瞬时流量测试项 8.0000 2009-3-2 14:30:00
60 4011 瞬时流量测试项 12.0000 2009-3-2 14:45:00
61 4011 瞬时流量测试项 20.0000 2009-3-2 15:00:00
62 4011 瞬时流量测试项 8.0000 2009-3-2 15:15:00
63 4011 瞬时流量测试项 12.0000 2009-3-2 15:30:00
64 4011 瞬时流量测试项 16.0000 2009-3-2 15:45:00
65 4011 瞬时流量测试项 0.0000 2009-3-2 16:00:00
66 4011 瞬时流量测试项 0.0000 2009-3-2 16:15:00
67 4011 瞬时流量测试项 20.0000 2009-3-2 16:30:00
68 4011 瞬时流量测试项 16.0000 2009-3-2 16:45:00
69 4011 瞬时流量测试项 4.0000 2009-3-2 17:00:00
70 4011 瞬时流量测试项 0.0000 2009-3-2 17:15:00
71 4011 瞬时流量测试项 0.0000 2009-3-2 17:30:00
72 4011 瞬时流量测试项 0.0000 2009-3-2 17:45:00
73 4011 瞬时流量测试项 0.0000 2009-3-2 18:00:00
74 4011 瞬时流量测试项 0.0000 2009-3-2 18:15:00
75 4011 瞬时流量测试项 0.0000 2009-3-2 18:30:00
76 4011 瞬时流量测试项 0.0000 2009-3-2 18:45:00
77 4011 瞬时流量测试项 0.0000 2009-3-2 19:00:00
78 4011 瞬时流量测试项 0.0000 2009-3-2 19:15:00
79 4011 瞬时流量测试项 0.0000 2009-3-2 19:30:00
80 4011 瞬时流量测试项 0.0000 2009-3-2 19:45:00
81 4011 瞬时流量测试项 0.0000 2009-3-2 20:00:00
82 4011 瞬时流量测试项 0.0000 2009-3-2 20:15:00
83 4011 瞬时流量测试项 8.0000 2009-3-2 20:30:00
84 4011 瞬时流量测试项 12.0000 2009-3-2 20:45:00
85 4011 瞬时流量测试项 0.0000 2009-3-2 21:00:00
86 4011 瞬时流量测试项 0.0000 2009-3-2 21:15:00
87 4011 瞬时流量测试项 0.0000 2009-3-2 21:30:00
88 4011 瞬时流量测试项 0.0000 2009-3-2 21:45:00
89 4011 瞬时流量测试项 0.0000 2009-3-2 22:00:00
90 4011 瞬时流量测试项 0.0000 2009-3-2 22:15:00
91 4011 瞬时流量测试项 0.0000 2009-3-2 22:30:00
92 4011 瞬时流量测试项 24.0000 2009-3-2 22:45:00
93 4011 瞬时流量测试项 4.0000 2009-3-2 23:00:00
94 4011 瞬时流量测试项 16.0000 2009-3-2 23:15:00
95 4011 瞬时流量测试项 16.0000 2009-3-2 23:30:00
96 4011 瞬时流量测试项 4.0000 2009-3-2 23:45:00

我现在希望按照每个小时进行统计,希望得到如下结果
itemid itemname sumvalue count maxvalue datetime
4011 瞬时流量测试项 0 4 0 2009-3-2
4011 瞬时流量测试项 0 4 0 2009-3-2 1:00:00
4011 瞬时流量测试项 20 0 12 2009-3-2 2:00:00
.............................
.............................
4011 瞬时流量测试项 40 0 16 2009-3-2 23:00:00

sumvalue为1个小时内的value的和
count为1个小时内value为0出现的个数
maxvalue为1个小时内value的最大值
如果还能有个1,2,3,4。。。24的字段来表示这条记录是哪个小时内的,那更好

我在论坛里找了个
http://topic.csdn.net/u/20071130/10/1c4fdd1e-fcf0-459e-8d6a-a7fc6c910cd2.html
其中2楼的回复正是我需要的,不过我看不懂,而且语法是sqlserver的,有人能解释下吗?还有,如果用oracle,那该如何去写?








...全文
194 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
veardn 2009-03-05
  • 打赏
  • 举报
回复
算了,我就分2次查了
veardn 2009-03-04
  • 打赏
  • 举报
回复
因为不用distinct会有很多重复的记录所以,只能用嵌套查询

select item_id,type_name,sum(data_value) sumvalue
,count(data_value) count,max(data_value) maxvalue
,to_char(data_time,'YYYY-MM-DD HH24') datetime
from

(select distinct a.item_id,b.type_name,c.data_value,c.data_time
from t_data_item a,t_data_type b,t_data c
where a.station_id=1211
and a.type_id=b.type_id
and a.item_id=c.item_id
and b.type_name like '%瞬时流量%'
and c.data_time>=to_date('2009-03-02 00:00:00','yyyy-mm-dd hh24:mi:ss')
and c.data_time<to_date('2009-03-03 00:00:00','yyyy-mm-dd hh24:mi:ss'))

GROUP BY item_id,type_name,to_char(data_time,'YYYY-MM-DD HH24')
order by datetime

但我希望count是一小时内value为0的个数,这个该怎么写进去?
Andy__Huang 2009-03-04
  • 打赏
  • 举报
回复
to_char()函数弄错了,少了一个字母
to_char(c.data_time,'YYYY-MM-DD H24')-->to_char(c.data_time,'YYYY-MM-DD HH24')


select a.item_id,b.type_name,sum(c.data_value) sumvalue
,count(c.data_value) count,max(c.data_value) maxvalue
,to_char(c.data_time,'YYYY-MM-DD HH24') datetime
from t_data_item a,t_data_type b,t_data c
where a.station_id=1211
and a.type_id=b.type_id
and a.item_id=c.item_id
and b.type_name like '%瞬时流量%'
and c.data_time>=to_date('2009-03-02 00:00:00','yyyy-mm-dd hh24:mi:ss')
and c.data_time <to_date('2009-03-03 00:00:00','yyyy-mm-dd hh24:mi:ss')
GROUP BY a.item_id,b.type_name,to_char(c.data_time,'YYYY-MM-DD HH24')
order by 6
veardn 2009-03-04
  • 打赏
  • 举报
回复
还是报错,日期格式无法识别
Andy__Huang 2009-03-04
  • 打赏
  • 举报
回复
select a.item_id,b.type_name,sum(c.data_value) sumvalue
,count(c.data_value) count,max(c.data_value) maxvalue
,to_char(c.data_time,'YYYY-MM-DD H24') datetime
from t_data_item a,t_data_type b,t_data c
where a.station_id=1211
and a.type_id=b.type_id
and a.item_id=c.item_id
and b.type_name like '%瞬时流量%'
and c.data_time>=to_date('2009-03-02 00:00:00','yyyy-mm-dd hh24:mi:ss')
and c.data_time <to_date('2009-03-03 00:00:00','yyyy-mm-dd hh24:mi:ss')
GROUP BY a.item_id,b.type_name,to_char(c.data_time,'YYYY-MM-DD H24')
order by 6

直接按第6列排序,不用写列名
veardn 2009-03-04
  • 打赏
  • 举报
回复
分组是这样的:2009-3-2<=datetime<2009-3-22009-3-2 1:00:00 ,
2009-3-2 2009-3-2 1:00:00<=datetime<2009-3-22009-3-2 2:00:00
即大于等于前面那个日期,小于后面那个日期
veardn 2009-03-04
  • 打赏
  • 举报
回复
我按照1楼的写法把order by c.data_time改成order by datetime 后报错:日期格式无法识别
Andy__Huang 2009-03-04
  • 打赏
  • 举报
回复
select a.item_id,b.type_name,sum(c.data_value) sumvalue
,count(c.data_value) count,max(c.data_value) maxvalue
,to_char(c.data_time,'YYYY-MM-DD H24') datetime
from t_data_item a,t_data_type b,t_data c
where a.station_id=1211
and a.type_id=b.type_id
and a.item_id=c.item_id
and b.type_name like '%瞬时流量%'
and c.data_time>=to_date('2009-03-02 00:00:00','yyyy-mm-dd hh24:mi:ss')
and c.data_time <to_date('2009-03-03 00:00:00','yyyy-mm-dd hh24:mi:ss')
GROUP BY a.item_id,b.type_name,to_char(c.data_time,'YYYY-MM-DD H24')
order by c.data_time
白发程序猿 2009-03-04
  • 打赏
  • 举报
回复
好像能用case when把你那个count写出来,不过我不会
veardn 2009-03-04
  • 打赏
  • 举报
回复
HAVING count(data_value)=0是没有记录的意思,

在我这里的业务中,0代表的是瞬时流量为0(有数据,但值为0);而count(data value)=0代表一条记录也没有(没数据)
Andy__Huang 2009-03-04
  • 打赏
  • 举报
回复

这里的count查出来的就是data_value的值在一小时内等于0的次数

问题是怎么把这2条sql语句结合在一起?
============================
不太明白你的意思?

oraclelogan 2009-03-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hdhai9451 的回复:]
加having 筛选

select item_id,type_name,sum(data_value) sumvalue
,count(data_value) count,max(data_value) maxvalue
,to_char(data_time,'YYYY-MM-DD HH24') datetime
from

(select distinct a.item_id,b.type_name,c.data_value,c.data_time
from t_data_item a,t_data_type b,t_data c
where a.station_id=1211
and a.type_id=b.type_id
and a.item_id=c.item_id
and b.type_name like '%瞬时流量…
[/Quote]

学习了,新老大!
veardn 2009-03-04
  • 打赏
  • 举报
回复

0-1 4
1-2 4
2-3 0
3-4 0
。。。
。。。

select item_id,type_name,count(data_value) count,
to_char(data_time,'YYYY-MM-DD HH24') datetime
from

(select distinct a.item_id,b.type_name,c.data_value,c.data_time
from t_data_item a,t_data_type b,t_data c
where a.station_id=1211
and a.type_id=b.type_id
and a.item_id=c.item_id
and b.type_name like '%瞬时流量%'
and c.data_value=0

and c.data_time>=to_date('2009-03-02 00:00:00','yyyy-mm-dd hh24:mi:ss')
and c.data_time <to_date('2009-03-03 00:00:00','yyyy-mm-dd hh24:mi:ss'))

GROUP BY item_id,type_name,to_char(data_time,'YYYY-MM-DD HH24')
order by datetime

这里的count查出来的就是data_value的值在一小时内等于0的次数

问题是怎么把这2条sql语句结合在一起?
Andy__Huang 2009-03-04
  • 打赏
  • 举报
回复
加having 筛选

select item_id,type_name,sum(data_value) sumvalue
,count(data_value) count,max(data_value) maxvalue
,to_char(data_time,'YYYY-MM-DD HH24') datetime
from

(select distinct a.item_id,b.type_name,c.data_value,c.data_time
from t_data_item a,t_data_type b,t_data c
where a.station_id=1211
and a.type_id=b.type_id
and a.item_id=c.item_id
and b.type_name like '%瞬时流量%'
and c.data_time>=to_date('2009-03-02 00:00:00','yyyy-mm-dd hh24:mi:ss')
and c.data_time <to_date('2009-03-03 00:00:00','yyyy-mm-dd hh24:mi:ss'))

GROUP BY item_id,type_name,to_char(data_time,'YYYY-MM-DD HH24')
HAVING count(data_value)=0
order by datetime

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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