首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

重復記錄:在某一段時間內多次刷卡只算一次解决思路

2012-02-17 
重復記錄:在某一段時間內多次刷卡只算一次重復記錄:在某一段時間內多次刷卡只算一次如以下刷卡記錄:CnocDa

重復記錄:在某一段時間內多次刷卡只算一次
重復記錄:在某一段時間內多次刷卡只算一次
如以下刷卡記錄:
CnocDateTime
1712006/09/14   14:06:00
1712006/09/14   14:30:00
1712006/09/14   14:50:00
11712006/09/14   14:05:00
11712006/09/14   15:00:00
11712006/09/14   16:06:00

如果在前後兩次刷卡時間沒有超過30分鐘則只算一條,結果如下:
CnocDateTime
1712006/09/14   14:06:00
1712006/09/14   14:50:00
11712006/09/14   14:05:00
11712006/09/14   15:00:00
11712006/09/14   16:06:00



[解决办法]
try


Delete A From 表 A
Where Exists(Select Cno From 表 Where Cno = A.Cno And DateDiff(mi, cDateTime, A.cDateTime) <= 30)
[解决办法]
1楼的不行:

1712006/09/14 14:06:00
1712006/09/14 14:30:00
1712006/09/14 14:50:00


这三条记录相差都不超过30 分钟, 归一楼的方法只会出1条, 但楼主要求的是出2条
[解决办法]
declare @t table(Cno int,cDateTime datetime)
insert @t
select 171, '2006/09/14 14:06:00 ' union all
select 171, '2006/09/14 14:30:00 ' union all
select 171, '2006/09/14 14:50:00 ' union all
select 1171, '2006/09/14 14:05:00 ' union all
select 1171, '2006/09/14 15:00:00 ' union all
select 1171, '2006/09/14 16:06:00 '
select * from @t

select * from @t as a where exists
(select 1 from @t where Cno = a.Cno and datediff(minute,cDateTime,a.cDateTime) > 30)
or
not exists(select 1 from @t where Cno = a.Cno and cDateTime < a.cDateTime)


/*結果
CnocDateTime
-------------------------------
1712006/09/14 14:06:00
1712006/09/14 14:50:00
11712006/09/14 14:05:00
11712006/09/14 15:00:00
11712006/09/14 16:06:00
*/


[解决办法]
--方法二:update临时表
create table tb(Cno int,cDateTime datetime)
insert tb
select 171, '2006/09/14 14:06:00 ' union all
select 171, '2006/09/14 14:30:00 ' union all
select 171, '2006/09/14 14:40:00 ' union all
select 171, '2006/09/14 14:50:00 ' union all
select 171, '2006/09/14 15:06:00 ' union all
select 171, '2006/09/14 14:55:00 ' union all
select 1171, '2006/09/14 14:05:00 ' union all
select 1171, '2006/09/14 15:00:00 ' union all
select 1171, '2006/09/14 16:06:00 '

go
select *,1 as flag into #tb from tb order by cno,cDateTime
declare @cno int,@cDateTime datetime,@flag int

update #tb
set @flag = case when @cno = cno and datediff(mi,@cDateTime,cDateTime) < 30 then 0 else 1 end
,@cno = cno,@cDateTime = case when @flag = 0 then @cDateTime else cDateTime end,flag = @flag

select * from #tb where flag = 1
go
drop table tb,#tb
/*
Cno cDateTime flag
----------- ------------------------------------------------------ -----------
171 2006-09-14 14:06:00.000 1
171 2006-09-14 14:40:00.000 1
1171 2006-09-14 14:05:00.000 1
1171 2006-09-14 15:00:00.000 1
1171 2006-09-14 16:06:00.000 1

(5 row(s) affected)
*/

------解决方案--------------------


create table #tb(Cno int,cDateTime datetime)
insert #tb
select 171, '2006/09/14 14:06:00 ' union all
select 171, '2006/09/14 14:30:00 ' union all
select 171, '2006/09/14 14:31:00 ' union all
select 171, '2006/09/14 14:50:00 ' union all
select 1171, '2006/09/14 14:05:00 ' union all
select 1171, '2006/09/14 15:00:00 ' union all
select 1171, '2006/09/14 16:06:00 '


select a.cno,min(a.cDateTime) from #tb a
left join (select cno,min(cdatetime)[cdatetime] from #tb group by cno) b
on b.cno=a.cno
group by a.cno,datediff(n,b.cdatetime,a.cdatetime)/30

热点排行