очистка данных с использованием группировки по временному интервалу - sql2005 - PullRequest
0 голосов
/ 12 января 2011

У меня есть следующие данные в таблице, о которых я хотел бы сообщить, не удаляя строки.

ActiveSearchID --- SearchDate --------------------- SearchPhrase
1 --------------------- 2010-12-15 12: 01: 11.587 --- argos
2 --------------------- 2010-12-15 12: 03: 40.193 --- muji
3 --------------------- 2010-12-15 12: 03: 42.370 --- muji
4 --------------------- 2010-12-15 12: 04: 29.167 --- Канцелярские товары
5 --------------------- 2010-12-15 12: 05: 11.590 --- лава
9 --------------------- 2010-12-15 12: 08: 38.920 --- sony vaio
10 ------------------- 2010-12-15 12: 08: 41.170 --- sony vaio
12 ------------------- 2010-12-15 12: 09: 09.920 --- sony vaio battery
13 ------------------- 2010-12-15 12: 09: 17.487 --- батарея Sony Vaio
14 ------------------- 2010-12-15 12: 17: 10.980 --- sony vaio battery
15 ------------------- 2010-12-15 12: 17: 12.170 --- argos

Отчет, который я пытаюсь получить, состоит в том, чтобы выбрать первый экземпляр поисковой фразы, который был найден в течение 5 минут. Так, например, запрос без информации, приведенной выше, приведет к следующему:
SearchDate ---------------- SearchPhrase
2010-12-15 12: 01: 11.587 --- argos
2010-12-15 12: 03: 40.193 --- muji
2010-12-15 12: 04: 29.167 --- Канцелярские товары
2010-12-15 12: 05: 11.590 --- лава
2010-12-15 12: 08: 38.920 --- sony vaio
2010-12-15 12: 09: 09.920 --- sony vaio battery
2010-12-15 12: 17: 12.170 --- argos


Я пробовал следующий запрос, но все еще получаю дубликаты:

выберите t1.searchdate, t1.searchphrase от активных поисков т1 внутреннее объединение активных поисков t2 на t1.searchphrase = t2.searchphrase и t1.searchdate


Я бы хотел использовать тип запроса "WITH SearchPhrases AS ()", но я просто не могу обойти его.

Спасибо

1 Ответ

0 голосов
/ 05 марта 2011

Я считаю, что с учетом ваших тестовых данных "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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...