Я считаю, что с учетом ваших тестовых данных "sony vaio battery" должен был быть возвращен дважды.Я предложил два варианта.
-- 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-минутные интервалы на часах, это может работать лучше - я не тестировал ни с большим количеством данных:
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