来个有难度的SQL,期待高手!

shuai45 2010-12-07 04:17:59
time name
2010-12-11 08:20:02 a
2010-12-11 08:20:04 a
2010-12-11 08:20:15 a
2010-12-11 08:20:55 a
2010-12-11 08:20:50 b


基本条件:相同name之间的时间差必须在[3秒 和 30分钟]之间.
例如:第一条和第二条数据时间差小于3秒,那1和2条数据仅算一条数据。
第二条和第三条在[3秒 和 30分钟]之间,算一条。
而第三条和第四条由于大于了30分钟,那单独算一条。
最后结果如下:

name count startTime endTime
a 3 2010-12-11 08:20:02 2010-12-11 08:20:15
a 1 2010-12-11 08:20:55 2010-12-11 08:20:55
b 1 2010-12-11 08:20:50 2010-12-11 08:20:50
...全文
192 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
dawugui 2010-12-08
  • 打赏
  • 举报
回复
如果数据是这样又该如何算?

time name
2010-12-11 08:20:02 a
2010-12-11 08:20:04 a
2010-12-11 08:20:06 a

算几条?
小宏 2010-12-08
  • 打赏
  • 举报
回复
留个记号,明天学习!!!
coleling 2010-12-08
  • 打赏
  • 举报
回复
楼主,那以下数据的结果应该是什么?
2010-12-11 08:20:02 a
2010-12-11 08:20:04 a
2010-12-11 08:20:06 a
2010-12-11 08:20:15 a

shuai45 2010-12-08
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 chuifengde 的回复:]
自已的问题都没搞清楚就提问啊?
[/Quote]
正确的,我在3楼我做了重新回答。

您没认真看大家的回答和提问。
不过还是谢谢你。
chuifengde 2010-12-08
  • 打赏
  • 举报
回复
自已的问题都没搞清楚就提问啊?
coleling 2010-12-08
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 shuai45 的回复:]

引用 15 楼 dawugui 的回复:
如果数据是这样又该如何算?

time name
2010-12-11 08:20:02 a
2010-12-11 08:20:04 a
2010-12-11 08:20:06 a

算几条?

得出的数据应该是:
name count startTime endTime
a 3 ……
[/Quote]

楼主自相矛盾了,你的示例数据:
2010-12-11 08:20:02 a
2010-12-11 08:20:04 a
2010-12-11 08:20:15 a

你在#3的结果是
a 1 2010-12-11 08:20:02 2010-12-11 08:20:02
a 2 2010-12-11 08:20:04 2010-12-11 08:20:15

要么是你的#3错了,要么是#17错了
shuai45 2010-12-08
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 dawugui 的回复:]
如果数据是这样又该如何算?

time name
2010-12-11 08:20:02 a
2010-12-11 08:20:04 a
2010-12-11 08:20:06 a

算几条?
[/Quote]
得出的数据应该是:
name count startTime endTime
a 3 2010-12-11 08:20:02 2010-12-11 08:20:06
coleling 2010-12-08
  • 打赏
  • 举报
回复

create table tb(time datetime,name varchar(10))
insert tb select '2010-12-11 08:20:02', 'a'
insert tb select '2010-12-11 08:20:04', 'a'
insert tb select '2010-12-11 08:20:15', 'a'
insert tb select '2010-12-11 08:20:55', 'a'
insert tb select '2010-12-11 08:20:50', 'b'
go

with t1 as
(
select rowid = row_number() over(partition by name order by time),* from tb
)
,t2 as
(
select a.*,endTime = isnull(b.time,a.time)
from t1 a
left join t1 b
on a.name = b.name and b.rowid = a.rowid + 1 and b.time > dateadd(s,3,a.time) and b.time < dateadd(s,30,a.time)
)

select name,count = count(1),startTime = min(time),endTime
from t2
group by name,endTime
order by name,endTime

/*
name count startTime endTime
---------- ----------- ----------------------- -----------------------
a 1 2010-12-11 08:20:02.000 2010-12-11 08:20:02.000
a 2 2010-12-11 08:20:04.000 2010-12-11 08:20:15.000
a 1 2010-12-11 08:20:55.000 2010-12-11 08:20:55.000
b 1 2010-12-11 08:20:50.000 2010-12-11 08:20:50.000

(4 行受影响)
*/


如OK,记得结贴哦
茫茫大海 2010-12-07
  • 打赏
  • 举报
回复
楼主,应该是3秒到30秒吧!
gll062 2010-12-07
  • 打赏
  • 举报
回复
没看明白
whb147 2010-12-07
  • 打赏
  • 举报
回复
排好序,然后计算一个差值,然后用游标走吧
qi04072008 2010-12-07
  • 打赏
  • 举报
回复
正在关注
lhblxm 2010-12-07
  • 打赏
  • 举报
回复
明天再来看看
oO寒枫Oo 2010-12-07
  • 打赏
  • 举报
回复
这个应该不难 楼主把题目说清楚
1.在表中增加一列Timediffer 计算所有列对第一列的时间差(秒数)
2.用游标 一行一行的来读 多定义2个变量 存储上次读到的记录和当次读到的记录
再用Timediffer 来进行判断
按照你的需求插入你所要的记录
Q315054403 2010-12-07
  • 打赏
  • 举报
回复
写个循环判断喽
jiemo587 2010-12-07
  • 打赏
  • 举报
回复
明天来
road84 2010-12-07
  • 打赏
  • 举报
回复
恩 没看明白
shuai45 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 chuifengde 的回复:]
那你的结果中第一条count为何为3?
[/Quote]
哦,错了,
正确的数据应该是:
name count startTime endTime
a 1 2010-12-11 08:20:02 2010-12-11 08:20:2
a 2 2010-12-11 08:20:04 2010-12-11 08:20:15
a 1 2010-12-11 08:20:55 2010-12-11 08:20:55
b 1 2010-12-11 08:20:50 2010-12-11 08:20:50
chuifengde 2010-12-07
  • 打赏
  • 举报
回复
那你的结果中第一条count为何为3?

34,590

社区成员

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

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