以下问题SQL语句如何写?

comman_wang 2002-09-29 09:19:23
我需要按ID统计每个ID在连续两天内(每天从00:00:00开始计算)的数量和最大的记录:
id number time
133070201 1 2001-12-18 15:39:42
133070202 6 2001-12-18 15:42:04
133070201 5 2001-12-19 15:43:16
133070202 6 2001-12-19 15:44:13
133070201 3 2001-12-20 10:21:29
133070202 90 2001-12-21 15:22:02
133070201 2 2001-12-22 15:25:29

结果为
id sum time(发生第一次的时间)
133070201 8 2001-12-19 15:43:16
133070202 96 2001-12-19 15:44:13

望高手指教.
...全文
34 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
comman_wang 2002-10-05
  • 打赏
  • 举报
回复
To newly_ignorant(不学无术):
还有一个问题想请教一下:
希望能用一个SQL语句按月统计出所有物资的数量:但是只有time字段可以利用,用group by datepart(month,time)产生错误,还有别的替代方法吗?望继续讨论!
newly_ignorant 2002-10-01
  • 打赏
  • 举报
回复
条件很简单的,赫赫

datediff(day,b.time,a.time) between 0 and N
两天时 N=1
五天 N=4
一周 N=6
十天 N=9

依次类推





newly_ignorant 2002-10-01
  • 打赏
  • 举报
回复
不用临时表也是可以的,可惜现在太晕,赫赫。
comman_wang 2002-09-30
  • 打赏
  • 举报
回复
To newly_ignorant(不学无术):
你的方法是可行的,但是我觉得可能还有以下问题:
一、如果条件是五天、一周或是十天,条件将会是十分长;
二、需要创建临时表,当数据量大时,不知效率如何

btw:
02的数据有误,2001-12-19 15:44:13应是2001-12-20 15:44:13


所以结果为
id sum time(发生第一次的时间)
133070202 96 2001-12-20 15:44:13

newly_ignorant 2002-09-30
  • 打赏
  • 举报
回复
select identity(int,1,1) as nid,a.id,isnull(a.number,0)+isnull(b.number,0) as nnum,a.time
into #t1
from t1 a left outer join t1 b
on a.id=b.id and datediff(day,b.time,a.time)=1

select a.id,a.nnum,a.time
from #t1 a
right outer join
(select id,max(nnum) mnum from #t1 group by id) b
on a.id=b.id and a.nnum=b.mnum

drop #t1

楼主的原始数据有问题:(,最后两个时间都快了一天,赫赫

newly_ignorant 2002-09-30
  • 打赏
  • 举报
回复
楼主指:连续两天的和最大 ,并求出这个最大的和以及两天中的第一天的那条记录。

newly_ignorant 2002-09-30
  • 打赏
  • 举报
回复
select identity(int,1,1) as nid,a.id
,(select sum(isnull(b.number,0)) from t1 b where a.id=b.id
and (datediff(day,b.time,a.time)=1 or datediff(day,b.time,a.time)=0)) as nnum
,a.time
into #t1
from t1 a

select a.id,a.nnum,a.time
from #t1 a
right outer join
(select id,max(nnum) mnum from #t1 group by id) b
on a.id=b.id and a.nnum=b.mnum
newly_ignorant 2002-09-30
  • 打赏
  • 举报
回复
如果同一天某个ID有多条记录,需要进一步考虑

(不是理解差异,赫赫,是02的结果不一样)
comman_wang 2002-09-30
  • 打赏
  • 举报
回复
To newly_ignorant(不学无术):
谢谢你的帮助。采用datediff函数可以很省力气,但是两天里可能对同一个ID有多个记录,在这里应需要用sum求和(这时datediff函数可能无法使用了,我个人认为)。对于说最后两个时间都快了一天,可能是理解上的差异:
对于ID为133070201,应选出以下两天的记录(在这里也是两条):
id number time
133070201 5 2001-12-19 15:43:16
133070201 3 2001-12-20 10:21:29
所以结果为
id sum time(发生第一次的时间)
133070201 8 2001-12-19 15:43:16

望继续加以讨论。谢谢。


cxmcxm 2002-09-30
  • 打赏
  • 举报
回复
将Yang_(扬帆破浪) 的查询写成存储过程即可
comman_wang 2002-09-29
  • 打赏
  • 举报
回复
up
qffhq 2002-09-29
  • 打赏
  • 举报
回复
用最小的时间,Min(Time)呀
QQ:81370026
comman_wang 2002-09-29
  • 打赏
  • 举报
回复
谢谢各位.可能我没说清楚,记录是非常多的,所以无法使用这样的条件:
"where time>='2002-9-19'and time<'2002-9-21'"
time指的是满足条件的第一次发生的时间
如对于id为133070201其sum和为8共有两笔:2001-12-19 15:43:16和
2001-12-20 10:21:29所以time为2001-12-19 15:43:16.



Yang_ 2002-09-29
  • 打赏
  • 举报
回复
select id,sum(number) as [sum],min(time) as time
from tablename
where time>='2002-9-19'
and time<'2002-9-21'
group by id

Yang_ 2002-09-29
  • 打赏
  • 举报
回复
select id,sum(number) as [sum],min(time) as time
from tablename
where time>='2002-9-19'
and time<'2002-9-21'
qffhq 2002-09-29
  • 打赏
  • 举报
回复
select id,sum(number) AS Aum Min(time) as Time
from table
group by id
comman_wang 2002-09-29
  • 打赏
  • 举报
回复
希望能用一个SQL语句写出

34,575

社区成员

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

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