0

行を削除せずにレポートしたいテーブルに次のデータがあります。

ActiveSearchID---SearchDate---------------------SearchPhrase
1---------------------2010 -12-15 12:01:11.587---アルゴス
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---ソニー ヴァイオ
10---- ---------------2010-12-15 12:08:41.170---ソニーバイオ
12------------------- 2010-12-15 12:09:09.920 --- ソニー ヴァイオ バッテリー
13-------------------2010-12-15 12:09:17.487 --- ソニーバイオバッテリー
14-------------------2010-12-15 12:17:10.980---ソニーバイオバッテリー
15----------- --------2010-12-15 12:17:12.170---アルゴス

私が取得しようとしているレポートは、5 分以内に検索された検索フレーズの最初のインスタンスを選択することです。たとえば、上記の情報を照会しないと、次のようになります。
SearchDate----------------SearchPhrase
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 ---sony vaio
2010-12-15 12:09:09.920---sony vaio バッテリー
2010-12-15 12:17:12.170---アルゴス


次のクエリを試しましたが、まだ重複しています:

t1.searchdate、t1.searchphrase を activesearches から選択 t1 内部結合 activesearches t2 on t1.searchphrase = t2.searchphrase および t1.searchdate < t2.searchdate where datediff(s, t1.searchdate, t2.searchdate) <= 300 order by searchdate


「WITH SearchPhrases AS ()」タイプのクエリを使用したいのですが、理解できません。

ありがとう

4

1 に答える 1

0

あなたのテストデータ「sony vaio battery」を考えると、2回返されるべきだったと思います。私は2つの選択肢を思いつきました。

-- 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
于 2011-03-05T05:56:19.267 に答える