2010-12-06 6 views
0

ありがとうございました。私は私がやりたいことのすべてが互いの5分以内の通話の数を持っているWhoCalledのすべてを見つけることですので、SQLシンプルな日時カウントが発生しました。

SegmentDT DateTime, 
WhoCalled varchar(4) 

のようなデータベースを持っているMSSQL 2005

を使用しています。

どうすればこの問題を解決できますか?

+1

出力を含む例を追加できますか? 3行あり、すべてが= 'beth'とsegmentDTの値を持つ場合、2010年1月1日12:00、2010年1月1日12:01、2010年1月1日12時02分、あなたはどんな結果を期待しますか? – Beth

答えて

0
SELECT WhoCalled, count(*) 
FROM tbl a 
INNER JOIN tbl b ON a.WhoCalled = b.WhoCalled 
AND DateDiff(n, a.SegmentDT, b.SegmentDT) > 0 
AND DateDiff(n, a.SegmentDT, b.SegmentDT) <= 5 
1
  • あなたは5分DATEDIFFが原因で境界が(0秒)に行われる方法で5分、59.997秒の範囲4分と0.003秒をカバーABS
  • を必要としないことがあり
  • COUNT

    :(DISTINCT SegmentDTは)あなたが

だから、300秒のウィンドウで複数の呼び出しを持って出現箇所を削除する必要があります10

別の定式化は、ウィンドウ関数を使用することです。これは隣接する行を比較します:

;WITH CTE AS 
(
    SELECT 
     WhoCalled, 
     ROW_NUMBER() OVER (ORDER BY SegmentDT) AS RowNum 
    FROM 
     MyTable 
) 
SELECT 
    WhoCalled, COUNT(*) 
FROM 
    CTE a 
    INNER JOIN 
    CTE b ON a.WhoCalled = b.WhoCalled AND a.RowNum + 1 = b.RowNum 
WHERE 
    DateDiff(second, a.SegmentDT, b.SegmentDT) <= 300