Sql server 2005 使用基于时间间隔的分组进行数据清理-sql2005
我希望在不必删除任何行的情况下报告表中的以下数据 ActiveSearchID---SearchDate-------------------SearchPhaseSql server 2005 使用基于时间间隔的分组进行数据清理-sql2005,sql-server-2005,grouping,aggregate,with-statement,Sql Server 2005,Grouping,Aggregate,With Statement,我希望在不必删除任何行的情况下报告表中的以下数据 ActiveSearchID---SearchDate-------------------SearchPhase 1------------------2010-12-15 12:01:11.587---argos 2------------------2010-12-15 12:03:40.193---无印良品 3------------------------------------------2010-12-15 12:03:42.370
1------------------2010-12-15 12:01:11.587---argos
2------------------2010-12-15 12:03:40.193---无印良品
3------------------------------------------2010-12-15 12:03:42.370---无印良品
4------------------2010-12-15 12:04:29.167--办公用品
5------------------2010-12-15 12:05:11.590---熔岩
9-----------------2010-12-15 12:08:38.920----索尼vaio
10-----------------2010-12-15 12:08:41.170----索尼vaio
12-----------------2010-12-15 12:09:09.920-------索尼vaio电池
13-----------------2010-12-15 12:09:17.487--索尼vaio电池
14------------------2010-12-15 12:17:10.980--索尼vaio电池
15-----------------2010-12-15 12:17:12.170---argos
我试图获取的报告是选择在5分钟间隔内搜索过的SearchPhase的第一个实例。 因此,例如,上述信息的查询no将导致以下结果:
搜索日期-----------------搜索短语
2010-12-15 12:01:11.587---argos
2010-12-15 12:03:40.193--无印良品
2010-12-15 12:04:29.167--办公用品
2010-12-15 12:05:11.590---熔岩 2010-12-15 12:08:38.920--索尼vaio
2010-12-15 12:09:09.920--索尼vaio电池
2010-12-15 12:17:12.170---argos
我尝试了以下查询,但仍然得到重复的查询:
选择t1.searchdate,t1.searchPhase 从ActiveSearchs t1 内部联接活动在t1上搜索t2.SearchPhase=t2.SearchPhase 和t1.searchdate
-- Populate test data
if(OBJECT_ID('tempdb..#Search') IS NOT NULL)
DROP TABLE #Search
create table #Search (
ActiveSearchID int primary key,
SearchDate datetime not null,
SearchPhrase nvarchar(30))
insert into #Search(ActiveSearchID, SearchDate, SearchPhrase)
select 1, '2010-12-15 12:01:11.587', 'argos'
union all select 2, '2010-12-15 12:03:40.193', 'muji'
union all select 3, '2010-12-15 12:03:42.370', 'muji'
union all select 4, '2010-12-15 12:04:29.167', 'Office supplies'
union all select 5, '2010-12-15 12:05:11.590', 'lava'
union all select 9, '2010-12-15 12:08:38.920', 'sony vaio'
union all select 10, '2010-12-15 12:08:41.170', 'sony vaio'
union all select 12, '2010-12-15 12:09:09.920', 'sony vaio battery'
union all select 13, '2010-12-15 12:09:17.487', 'sony vaio battery'
union all select 14, '2010-12-15 12:17:10.980', 'sony vaio battery'
union all select 15, '2010-12-15 12:17:12.170', 'argos'
我想你正在寻找类似这样的问题。不过,我不确定这将如何执行:
select *
from #Search as S
where not exists(
select * from #Search as N
where N.SearchPhrase= S.SearchPhrase
and N.SearchDate between
dateadd(minute, -5, S.SearchDate) AND S.SearchDate
and N.ActiveSearchID <> S.ActiveSearchID)
是否可以将“5分钟间隔内”定义为严格的日期时间间隔,如1:00-1:05、1:05-1:10、1:10-1:15?
select
ActiveSearchID, SearchDate, SearchPhrase
from
(
select
*,
ROW_NUMBER() over (
partition by SearchPhrase,
DATEDIFF(minute, '2000-01-01', SearchDate) / 5
order by SearchDate, ActiveSearchID) as rn,
DATEDIFF(minute, '2000-01-01', SearchDate) as five_minute_window
from #Search
) as X
where
rn = 1
order by
ActiveSearchID