查出一小时内记录

winnet 2010-03-21 11:39:23
sql2000表:meal

id d1 t1
================================
a21 2010-03-21 09:30:12
a22 2010-03-21 09:31:22
a23 2010-03-21 09:32:34
a21 2010-03-21 10:01:42
a24 2010-03-21 10:01:56
a21 2010-03-21 10:20:25
a22 2010-03-21 10:20:34

求出以上表中一小时内ID的记录数.

结果为:
a21 3
a22 2
a23 1
a24 1
----------------------------------------------------------------------------
请各位帮忙,我想了很久都想不出. 完成就结贴
...全文
204 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
长风dad 2010-03-22
  • 打赏
  • 举报
回复
select id,eshowName,addTime from eshow where datediff(dd,addtime,getDate())=0 and datepart(month,getdate())-datepart(month,addtime)=0 order by addtime


这里的修改了一下
长风dad 2010-03-22
  • 打赏
  • 举报
回复
select id,Count(id) as sss from meal where datediff(dd,d1,getDate())<1 and datepart(hour,t1)-datepart(hour,t1)>1 group by id order by sss
feegle_develop 2010-03-22
  • 打赏
  • 举报
回复
过来拉人...
新群招募 群号:31923373
new4everlau 2010-03-22
  • 打赏
  • 举报
回复
这个没想象的那么难吧?

create table #meal(id varchar(10),d1 char(10), t1 char(8))
go
insert #meal select 'a21','2010-03-21','09:30:12'
insert #meal select 'a22','2010-03-21','09:31:22'
insert #meal select 'a23','2010-03-21','09:32:34'
insert #meal select 'a21','2010-03-21','10:01:42'
insert #meal select 'a24','2010-03-21','10:01:56'
insert #meal select 'a21','2010-03-21','10:20:25'
insert #meal select 'a22','2010-03-21','10:20:34'
go
--'2010-03-21'到'09:30:12'
declare @date varchar(10),@time varchar(8)
select @date = '2010-03-21',@time='09:30:12'
select id,count(1)
from #meal
where convert(datetime,d1+' '+t1) between convert(datetime,@date+' '+@time) and DATEADD (mi , 60, convert(datetime,@date+' '+@time) )
group by id
drop table #meal
--'2010-03-21'-'09:30:12'一个小时内数据
---------------------------------------
a21 3
a22 2
a23 1
a24 1
--'2010-03-21'-'10:00:00'一个小时内数据
a21 2
a22 1
a24 1

winnet 2010-03-21
  • 打赏
  • 举报
回复
先多谢二位的热心.

你们的都是加了固定时间的,我想要的是时间不固定.例如我表中有从00-23点的记录呢?
我要找出的是任何时间一小时内的记录数.

declare @begindt datetime
,@i int --区间
set @begindt='2010-03-21 09:30:00' --我不能用变量来定义这个时间,这个时间应该是取自表的d1+ t1

或者换种方式表达:
我要统计出表中所有时间的一小时内相同ID的记录
东那个升 2010-03-21
  • 打赏
  • 举报
回复

create table #meal(id varchar(10),d1 char(10), t1 char(8))

insert #meal select 'a21','2010-03-21','09:30:12'
insert #meal select 'a22','2010-03-21','09:31:22'
insert #meal select 'a23','2010-03-21','09:32:34'
insert #meal select 'a21','2010-03-21','10:01:42'
insert #meal select 'a24','2010-03-21','10:01:56'
insert #meal select 'a21','2010-03-21','10:20:25'
insert #meal select 'a22','2010-03-21','10:20:34'


declare @begindt datetime
,@i int --区间

set @begindt='2010-03-21 09:30:00'
set @i=1
select id,count(*) from #meal
where datediff(ss,@begindt,d1+' '+t1)<=@i*3600
group by id

id
---------- -----------
a21 3
a22 2
a23 1
a24 1

(4 行受影响)
dawugui 2010-03-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 winnet 的回复:]
楼上的只是分组,没有把一小时内的条件加入
[/Quote]
你自己加入条件,我不知道你的条件想如何加?例如2楼那样吗?
winnet 2010-03-21
  • 打赏
  • 举报
回复
楼上的只是分组,没有把一小时内的条件加入
dawugui 2010-03-21
  • 打赏
  • 举报
回复
create table tb(id varchar(10),d1 varchar(10), t1 varchar(10))
insert into tb values('a21', '2010-03-21', '09:30:12')
insert into tb values('a22', '2010-03-21', '09:31:22')
insert into tb values('a23', '2010-03-21', '09:32:34')
insert into tb values('a21', '2010-03-21', '10:01:42')
insert into tb values('a24', '2010-03-21', '10:01:56')
insert into tb values('a21', '2010-03-21', '10:20:25')
insert into tb values('a22', '2010-03-21', '10:20:34')
go

select id , count(1) from tb group by id
/*
id
---------- -----------
a21 3
a22 2
a23 1
a24 1

(所影响的行数为 4 行)
*/

select id , count(1) from tb where d1 + ' ' +t1 between '2010-03-21 09:30:00' and '2010-03-21 10:30:00' group by id
/*
id
---------- -----------
a21 3
a22 2
a23 1
a24 1

(所影响的行数为 4 行)
*/

drop table tb
dawugui 2010-03-21
  • 打赏
  • 举报
回复
select id , count(1) from tb where ... group by id
xman_78tom 2010-03-21
  • 打赏
  • 举报
回复

-- 上面错误
create table #meal(id varchar(10),d1 char(10), t1 char(8))
go
insert #meal select 'a21','2010-03-21','09:30:12'
insert #meal select 'a22','2010-03-21','09:31:22'
insert #meal select 'a23','2010-03-21','09:32:34'
insert #meal select 'a21','2010-03-21','10:01:42'
insert #meal select 'a24','2010-03-21','10:01:56'
insert #meal select 'a21','2010-03-21','10:20:25'
insert #meal select 'a22','2010-03-21','10:20:34'
-- 为了让问题更清楚,添加几个数据
insert #meal select 'a21','2010-03-21','12:20:34'
insert #meal select 'a21','2010-03-21','12:23:34'
insert #meal select 'a22','2010-03-22','10:20:34'
go

select t1.id,count(*) cnt,min(t1.d1+' '+t1.t1) [start]
from #meal t1 inner join
(select id,'2010-03-21 00:'+right(min(t1),5) [diff] from #meal group by id) t2
on t1.id=t2.id
group by t1.id,datediff(ss,t2.diff,t1.d1+' '+t1.t1)/3600
/*
a21 3 2010-03-21 09:30:12
a22 2 2010-03-21 09:31:22
a23 1 2010-03-21 09:32:34
a24 1 2010-03-21 10:01:56
-----------------------------------
a21 2 2010-03-21 12:20:34
a22 1 2010-03-22 10:20:34
*/
xman_78tom 2010-03-21
  • 打赏
  • 举报
回复

select t1.id,max(t1.cnt) from
(select t1.id, t1.d1+' '+t1.t1 [start], COUNT(*) cnt
from #meal t1 join #meal t2
on t1.id=t2.id and datediff(ss,t1.d1+' '+t1.t1,t2.d1+' '+t2.t1) between 0 and 3600
group by t1.id,t1.d1+' '+t1.t1) t1
inner join
(select id,'2010-03-21 00:'+right(min(t1),5) [diff] from #meal group by id) t2
on t1.id=t2.id
group by t1.id,datediff(ss,[diff],[start])/3600
/*
a21 3
a22 2
a23 1
a24 1
*/
v1ctory1216 2010-03-21
  • 打赏
  • 举报
回复
7楼好像是可以的!
winnet 2010-03-21
  • 打赏
  • 举报
回复
多谢大家,可能是我表达不出来我想要的东西吧

我想要的就是表里每一个记录时间一小时内有多少条记录
如例数据:
a21 2010-03-21 09:30:12
a22 2010-03-21 09:31:22
a23 2010-03-21 09:32:34
a21 2010-03-21 10:01:42
a24 2010-03-21 10:01:56
a21 2010-03-21 10:20:25
a22 2010-03-21 10:20:34

那我就要找出上面A21 2010-03-21 09:30:12 后一小时这个A21有多少条记录,也就是09:30:12 - 10:30:12有多少条A21的记录,如果就是A21 有3次记录,同时后面二次A21已经计算入了第一行的A21,所以不再计算第二次出现A21记录一小时时间内的记录
然后再处理到第二行A22 2010-03-21 09:31:22 找出A22 09:31:22 - 10:31:22时间段内有多少A22的记录
再到第三条a23 2010-03-21 09:32:34 .......
到第四条a21 2010-03-21 10:01:42 ,注意了,这行的A21也经算进了第一行的A21里面,所以要跳过
接住处理第五行 a24 2010-03-21 10:01:56 ....
第六行 A21 也计算进了第一行,不处理
第七行 A22 同样也是计算进了第二行的A22中,所以不处理

我的要求就是这样,不知大家能不能理解到
yjh53615728 2010-03-21
  • 打赏
  • 举报
回复
如今答题只能猜
ACMAIN_CHM 2010-03-21
  • 打赏
  • 举报
回复
select id,count(*)
from meal
where t1>getdate()-1/24
group by id
lhblxm 2010-03-21
  • 打赏
  • 举报
回复
楼主所说的是不是每一天的每一小时内ID的出现次数
如果是这样
结果应该是:
a21 9:00-10:00 1
a22 9:00-10:00 1
a23 9:00-10:00 1
a21 10:00-11:00 2
a22 10:00-11:00 1
a24 10:00-11:00 1
xman_78tom 2010-03-21
  • 打赏
  • 举报
回复

create table #meal(id varchar(10),d1 char(10), t1 char(8))
go
insert #meal select 'a21','2010-03-21','09:30:12'
insert #meal select 'a22','2010-03-21','09:31:22'
insert #meal select 'a23','2010-03-21','09:32:34'
insert #meal select 'a21','2010-03-21','10:01:42'
insert #meal select 'a24','2010-03-21','10:01:56'
insert #meal select 'a21','2010-03-21','10:20:25'
insert #meal select 'a22','2010-03-21','10:20:34'
go

-- 很难了解 lz 要什么,不知道这个是否合适?
declare cur cursor for
select id,convert(datetime,d1+' '+t1) from #meal order by 2;
open cur;

declare @id varchar(10),@time datetime;
fetch next from cur into @id,@time;
while @@FETCH_STATUS=0
begin
select id,COUNT(id) cnt,
@time [start_time], DATEADD(SS,3600,@time) [end_time]
from #meal
where DATEDIFF(SS,@time,d1+' '+t1) between 0 and 3600
group by id;
fetch next from cur into @id,@time;
end

close cur;
deallocate cur;

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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