Получить максимальное количество одновременных звонков из базы данных - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь найти максимальное количество звонков на линии SIP из нашей базы данных.Вот пример данных:

ID  StartTime           EndTime
66  01/03/2018 5:31:18  01/03/2018 5:31:51
66  01/03/2018 5:31:51  01/03/2018 5:32:19
66  01/03/2018 5:32:21  01/03/2018 5:34:10
66  01/03/2018 5:32:31  01/03/2018 5:33:42
66  01/03/2018 5:33:02  01/03/2018 5:33:42
66  01/03/2018 5:33:23  01/03/2018 5:34:10
66  01/03/2018 5:33:45  01/03/2018 5:34:38
66  01/03/2018 5:34:08  01/03/2018 5:34:38

То, как я вычисляю это, визуально, число должно быть 5.

Ближайшее, что я дошел до этого, вернуло 4для этого примера и отключен на других тестах.Другой код, который я тестировал, был дико отключен (на 100 с).

DECLARE @ReportStartDate datetime, @ReportEndDate datetime,        
@ReportStartTime time, @ReportEndTime time
SET @ReportStartDate='1/3/2018'
SET @ReportEndDate='1/3/2018'
SET @ReportStartTime='05:00:00'
SET @ReportEndTime='06:00:00'

SET @ReportStartDate = (SELECT @ReportStartDate + @ReportStartTime)
SET @ReportEndDate = (SELECT @ReportEndDate + @ReportEndTime);

WITH C1 AS
(
  SELECT startdate AS ts, +1 AS TYPE,
    ROW_NUMBER() OVER(ORDER BY startdate) AS start_ordinal
  FROM table
  WHERE startdate >= @ReportStartDate and startdate <= @ReportEndDate
  and Service_id=66 --hardcoded for testing
  UNION ALL
  SELECT enddate, -1, NULL
  FROM table
  WHERE enddate >= @ReportStartDate and enddate <=    
 @ReportEndDate
  and Service_id=66 -- hardcoded for testing
),
C2 AS
(
  SELECT *,
    ROW_NUMBER() OVER(  ORDER BY ts, TYPE) AS start_or_end_ordinal
  FROM C1
)
SELECT MAX(2 * start_ordinal - start_or_end_ordinal) AS mx
FROM C2
WHERE TYPE = 1

1 Ответ

0 голосов
/ 27 декабря 2018

Я бы написал эту логику как:

with tt as (
      select id, stime as thetime, 1 as inc from t union all
      select id, etime, -1 as inc from t
     )
select top (1) tt.*
from (select tt.*, sum(inc) over (partition by id order by thetime) as overlaps
      from tt
     ) tt
order by overlaps desc;

Это также возвращает "4" для вашего примера, но это имеет смысл для меня.

Вы можете проверить это на это дб <> скрипка .

...