对datetime类型数据按时间间隔进行分组

xja31415 2015-06-05 09:11:14
DB(数据库版本): MSSQL2008

同一个表中的一个字段是datetime类型的,视两个记录为同一组当且仅当两条记录时间间隔小于15分钟且id相同,该怎么样得到所有记录的组序号。

例如:表结构:
id time1
1 2010-09-20 10:20:20
1 2010-09-20 10:22:20
1 2010-09-20 10:40:20
1 2010-09-20 10:45:20
1 2010-09-20 10:50:20
2 2010-09-18 10:22:20
2 2010-09-18 10:28:20
2 2010-09-18 16:29:20
2 2010-09-18 16:59:20


期望得到的结果如下:
id time1 event_id
1 2010-09-20 10:20:20 1
1 2010-09-20 10:22:20 1
1 2010-09-20 10:40:20 2
1 2010-09-20 10:45:20 2
1 2010-09-20 10:50:20 2
2 2010-09-18 10:22:20 3
2 2010-09-18 10:28:20 3
2 2010-09-18 16:29:20 4
2 2010-09-18 16:59:20 5

我是新手,折腾了好久都没弄出来,希望各位前辈能够指点!
...全文
416 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
hery2002 2015-06-06
  • 打赏
  • 举报
回复
DECLARE @t_TB TABLE ([id] NVARCHAR(5),[time1] DATETIME);
INSERT INTO @t_TB VALUES 
('1','2010-09-20 10:20:20'),
('1','2010-09-20 10:22:20'),
('1','2010-09-20 10:40:20'),
('1','2010-09-20 10:45:20'),
('1','2010-09-20 10:50:20'),
('2','2010-09-18 10:22:20'),
('2','2010-09-18 10:28:20'),
('2','2010-09-18 16:29:20'),
('2','2010-09-18 16:59:20');
 ;with mintime_cte
as
(
select id,min(time1) mintime from @t_TB group by id
)
, group_cte
as
(
SELECT   t.id, t.time1,
row_number() over(order by t.id) as rn,
row_number() over(partition by t.id,ceiling(iif(datediff(MINUTE,a.mintime,t.time1)/15.0<1,1,datediff(MINUTE,a.mintime,t.time1)/15.0)) order by t.id) as group_id
    FROM @t_TB t
left join mintime_cte a on a.id = t.id
)

-- 2008 --
select t.id,t.time1,
(select sum(g.group_id) from group_cte g  where g.rn<=t.rn and g.group_id =1) as c
from  group_cte  t
-- 2012 + --

 ;with mintime_cte
as
(
select id,min(time1) mintime from @t_TB group by id
)
, group_cte
as
(
SELECT   t.id, t.time1,
row_number() over(order by t.id) as rn,
row_number() over(partition by t.id,ceiling(iif(datediff(MINUTE,a.mintime,t.time1)/15.0<1,1,datediff(MINUTE,a.mintime,t.time1)/15.0)) order by t.id) as group_id
    FROM @t_TB t
left join mintime_cte a on a.id = t.id
)
select t.id,t.time1,
sum(iif(t.group_id=1,t.group_id,0))over(order by t.id ROWS UNBOUNDED PRECEDING) as c
from  group_cte  t
/*
id    time1                   c
----- ----------------------- --------------------
1     2010-09-20 10:20:20.000 1
1     2010-09-20 10:22:20.000 1
1     2010-09-20 10:40:20.000 2
1     2010-09-20 10:45:20.000 2
1     2010-09-20 10:50:20.000 2
2     2010-09-18 10:22:20.000 3
2     2010-09-18 10:28:20.000 3
2     2010-09-18 16:29:20.000 4
2     2010-09-18 16:59:20.000 5
*/
gw6328 2015-06-06
  • 打赏
  • 举报
回复


declare @t table(
	id int
	,time1 datetime
)

insert into @t (id,time1) values
(1,'2010-09-20 10:20:20')
,(1,'2010-09-20 10:22:20')
,(1,'2010-09-20 10:40:20')
,(1,'2010-09-20 10:45:20')
,(1,'2010-09-20 10:50:20')
,(2,'2010-09-18 10:22:20')
,(2,'2010-09-18 10:28:20')
,(2,'2010-09-18 16:29:20')
,(2,'2010-09-18 16:59:20')

;with c1 as (
	select rn=ROW_NUMBER() over(order by GETDATE()),* from @T
), c2 as (
select isnull(DATEDIFF(mi,b.time1,a.time1),0) as no,a.* from c1 a left join c1 b on a.rn=b.rn+1
), c3 as (
select ISNULL(a.rn,0) as no1,ISNULL(b.rn,10000000) as no2 from 
(select *,rnx=ROW_NUMBER() over(order by id) from c2 where ABS(no)>=15) a 
full join (select *,rnx=ROW_NUMBER() over(order by id) from c2 where ABS(no)>=15) b on a.rnx=b.rnx-1
)
select a.id,a.time1,DENSE_RANK() over(order by no1) as event_id from c2 a join c3 b on a.rn>=b.no1 and a.rn<b.no2

/*
id          time1                   event_id
----------- ----------------------- --------------------
1           2010-09-20 10:20:20.000 1
1           2010-09-20 10:22:20.000 1
1           2010-09-20 10:40:20.000 2
1           2010-09-20 10:45:20.000 2
1           2010-09-20 10:50:20.000 2
2           2010-09-18 10:22:20.000 3
2           2010-09-18 10:28:20.000 3
2           2010-09-18 16:29:20.000 4
2           2010-09-18 16:59:20.000 5
*/
gw6328 2015-06-06
  • 打赏
  • 举报
回复

--结果出来了,但是显示有点乱。
PowerBI系列之Power Query专题1.  获取数据 数据源种类介绍和获取Excel数据源输入数据和拷贝数据:创建辅助表解析Json/XML数据格式获取Web网页数据和URL添加动态参数连接数据的四种模式:Import、DirectQuery、Live Connection、Dual双 属于混合模式连接数据库:Sql server、 Mysql(直连但是必须先安装一个mysql插件)DirectQuery直连查询:Sql serverODBC方式获取数据表关联或多个Sql或调用存储过程获取数据SQL中动态传参和自定义函数: sql中使用参数或数据库名称使用参数连接Sharepoint和OneDrive数据源连接Dataset和Dataflow 替换本地数据源为Sharepoint数据源并保留数据处理操作 终止当前数据刷新Loading:Cancel Query数据源设置-重置数据连接凭证PBIDS连接数据源创建和使用报表模块(输入或值列表)利用报表模板和参数控制线下报表数据权限DirectQuery启用自动页面刷新和更改检测管理聚合表提高DirectQuery查询性能动态M查询参数提高DirectQuery查询性能添加数据刷新时间 DateTime.LocalNow()和Getdate()2.  数据清洗和M语言M语言和官方文档介绍PowerQuery中查阅M函数:=#shared, Ctrl+Space提示数据清洗之常用技能:提升标题、更改数据类型、保留删除错误或空行,删除重复项、选择列和删除列、填充单元格、合并列、拆分、提取、替换、条件替换、添加自定义列,添加条件列、添加索引列、分组、添加年月日列、追加和合并查询透视和逆透视以及转置合并单元格的Excel文件处理导入文件夹中多Excel文件并合并解决多文件合并中列顺序不一致使用参数和函数批量导入文件 文本中提取中文、英文、数字等处理双引号转义 列拆分详解解决列名改变错误解决列丢失错误动态显示、排序和重命名列为所有列名添加前缀列名字母大写和分隔符调整Trim标题列中的多余空格如何处理load数据错误为什么load的Excel数据有null空行为什么load的Excel数据标题在第二行灵活添加占位符规范同类相似数据数据按多列排序为分组添加Index序号分组内值合并诊断工具分析数据处理过程PowerQuery小技巧分享 新冠病例活动轨迹地图标识 

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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