SQL простой запрос даты и времени делает меня сумасшедшим! - PullRequest
0 голосов
/ 07 декабря 2010

Спасибо всем, кто может помочь.Я использую MSSQL 2005

У меня есть такая база данных

SegmentDT DateTime,
WhoCalled varchar(4)

Все, что я хочу сделать, - это найти все WhoCalled, которые имеют количество вызовов в течение 5 минут друг от друга.

Как мне это сделать?

Ответы [ 2 ]

1 голос
/ 07 декабря 2010
  • Вам может не понадобиться ABS
  • 5-минутный DATEDIFF охватывает диапазон от 4 минут и от 0,003 секунд до 5 минут и 59,997 секунд из-за того, как выполняются границы (ноль секунд)
  • COUNT (DISTINCT SegmentDT) должен удалять случаи, когда у вас есть несколько вызовов в 300-секундном окне

Итак:

SELECT
     WhoCalled, COUNT(DISTINCT SegmentDT)
FROM
     MyTable a
     INNER JOIN
     MyTable b ON a.WhoCalled = b.WhoCalled
WHERE
     ABS(DateDiff(second, a.SegmentDT, b.SegmentDT)) <= 300

Другая формулировка заключается в использовании оконной функции. Это сравнит соседние строки:

;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
0 голосов
/ 07 декабря 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...