Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Помогите написать sql запрос  [new]
foxtv
Member

Откуда:
Сообщений: 108
Есть таблица с номерами телефонов, время начала разговора, длительность разговора. Каким образом найти максимальное количество одновременно звонящих телефонов.
26 июн 13, 11:13    [14484659]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать sql запрос  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Рекомендации, пункты 6 и 4
26 июн 13, 11:15    [14484674]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать sql запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
foxtv
Есть таблица с номерами телефонов, время начала разговора, длительность разговора. Каким образом найти максимальное количество одновременно звонящих телефонов.
А где время начала звонка телефона, время конца звонка телефона?
26 июн 13, 11:17    [14484693]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать sql запрос  [new]
Добрый Э - Эх
Guest
foxtv, тут тебе нужен unpivot + накопительный итог.
Основная идея такая:
1) начала и кончала (кончало = начало + длительность) развернуть в таблицу, вида: дата_события, тип_события. Где дата события, естественно, либо начало, либо кончало. Ну атип, понятное дело, как таз и будет описывать что именно за дата у нас - начало или кончало. Для простоты можно брать +1 для начала разговора и -1 для его кончала. А дальше - дело техники. Накопительным итогом считаем сумму типов_событий. Каждый начавшийся разговор добавит единицу к одновременным звонкам, каждое кончало - отнимет её. После это останется лишь найти максимальное из значений накопительной суммы. :)
26 июн 13, 11:25    [14484755]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать sql запрос  [new]
Добрый Э - Эх
Guest
сумму считаем в отсортированном множестве разговоров в порядке: дата_начала, длительность. :)
26 июн 13, 11:27    [14484780]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать sql запрос  [new]
foxtv
Member

Откуда:
Сообщений: 108
iap,
Номер телефона----Время начала разговора----Длительность (минуты)
25623----20.06.2013 14:30----5
25621----20.06.2013 14:31----5
25622----20.06.2013 14:32----5
25624----20.06.2013 14:33----5
25625----20.06.2013 14:34----5

Результат: 5 телефонов которые одновременно занимали линию
26 июн 13, 12:39    [14485457]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать sql запрос  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
foxtv
iap,
Номер телефона----Время начала разговора----Длительность (минуты)
25623----20.06.2013 14:30----5
25621----20.06.2013 14:31----5
25622----20.06.2013 14:32----5
25624----20.06.2013 14:33----5
25625----20.06.2013 14:34----5

Результат: 5 телефонов которые одновременно занимали линию

одновременно занимали линию за какой промежуток то? В какое время? Требования какие?
26 июн 13, 12:44    [14485508]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать sql запрос  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
а номер линии где ?
26 июн 13, 12:44    [14485509]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать sql запрос  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
думаю, iap имел в виду, что даже если разговор еще не начался, линия уже занята
(абонент А слышит гудки пока абонент Б бежит из кухни к телефону:)
26 июн 13, 12:45    [14485519]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать sql запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Паганель
думаю, iap имел в виду, что даже если разговор еще не начался, линия уже занята
(абонент А слышит гудки пока абонент Б бежит из кухни к телефону:)
Я имел в виду, что хорошо бы сформулировать задачу на русском языке.
Всё-таки, "одновременно звонящих телефонов" - как это понимать без дополнительных пояснений?
26 июн 13, 12:49    [14485564]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать sql запрос  [new]
foxtv
Member

Откуда:
Сообщений: 108
Сергей Викт.,
Неважно за какой промежуток, неважно какая линия. Вопрос в том чтобы определить максимальную нагрузку, т.е. максимальное количество людей звонящих в одно и то же время.
26 июн 13, 12:49    [14485569]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать sql запрос  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
foxtv
Сергей Викт.,
Неважно за какой промежуток, неважно какая линия. Вопрос в том чтобы определить максимальную нагрузку, т.е. максимальное количество людей звонящих в одно и то же время.
http://ru.wikipedia.org/wiki/Эрланг
26 июн 13, 12:50    [14485580]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать sql запрос  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
foxtv
Сергей Викт.,
Неважно за какой промежуток, неважно какая линия. Вопрос в том чтобы определить максимальную нагрузку, т.е. максимальное количество людей звонящих в одно и то же время.

14484780
26 июн 13, 12:51    [14485588]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать sql запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
В общем, задача на пересечение промежутков времени?
Но ведь 5 телефонов из примера занимали линии одновременно не всегда.
Были моменты, когда один из них соединился, а остальные - нет.
А были моменты, когда таких было 3.
Снова непонятно что же нужно?
26 июн 13, 12:52    [14485603]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать sql запрос  [new]
foxtv
Member

Откуда:
Сообщений: 108
iap,

В данном примере в интервале 14:30 - 14:35 - занимали линию все пять телефонов и неважно со скольки каждый начинал разговор с 14:31 или 14:34.
26 июн 13, 12:56    [14485666]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать sql запрос  [new]
Добрый Э - Эх
Guest
foxtv,

ну хорошо, продолжаем словесные перепалки, раз вразумительных юзабильных тестовых данных нет.

2. Другой вариант решения поставленной задачи. Генерируем полный набор секунд за интересуемый период времени, пересекаем результат генерации со звонками, группируем по секундам, находим секунду с максимальным количеством повторений. ;)
26 июн 13, 12:58    [14485681]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать sql запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
WITH CTE AS(SELECT * FROM(VALUES(25623,'20130620 14:30',5),(25621,'20130620 14:31',5),(25622,'20130620 14:32',5),(25624,'20130620 14:33',5),(25625,'20130620 14:34',5))T(N,T,D))
SELECT TOP(1) WITH TIES T.N, T.T,
(
 SELECT COUNT(*)
 FROM CTE TT
 WHERE TT.T<=DATEADD(MINUTE,T.D,T.T) AND DATEADD(MINUTE,TT.D,TT.T)>=T.T
) C
FROM CTE T
ORDER BY C DESC;
26 июн 13, 13:27    [14485999]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать sql запрос  [new]
Добрый Э - Эх
Guest
iap,

Подход, конечно, интересный. Но в корне неверный.
Для примера на таких данных затестируй:
WITH
  CTE AS(
    SELECT * 
      FROM(
            VALUES(25623,'20130620 14:00',50),
                  (25621,'20130620 14:10',1),
                  (25622,'20130620 14:20',1),
                  (25624,'20130620 14:30',1),
                  (25625,'20130620 14:40',1)
          )T(N,T,D))
SELECT TOP(1) WITH TIES T.N, T.T,
(
 SELECT COUNT(*)
 FROM CTE TT
 WHERE TT.T<=DATEADD(MINUTE,T.D,T.T) AND DATEADD(MINUTE,TT.D,TT.T)>=T.T
) C
FROM CTE T
ORDER BY C DESC;

Вроде видно, что более двух разговоров одновременно не было... А запрос показывает совсем другое ;).
26 июн 13, 13:38    [14486119]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать sql запрос  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
Добрый Э - Эх, да во втором варианте все секунды не нужны, достаточно начала разговоров взять за опорную таблицу

WITH CTE AS(SELECT * FROM(VALUES(25623,'20130620 14:30',5),(25621,'20130620 14:31',5),(25622,'20130620 14:32',5),(25624,'20130620 14:33',5),(25625,'20130620 14:34',5))T(N,T,D))
,ticks AS (SELECT DISTINCT T AS tick FROM cte)
,counts AS (
	SELECT s.tick, COUNT(*) AS cnt 
	FROM ticks AS s
	JOIN cte AS t ON t.T <= s.tick AND DATEADD(mi, t.D, t.T) > s.tick
	GROUP BY s.tick
)
SELECT MAX(cnt) as maxcnt 
FROM counts;
26 июн 13, 13:38    [14486123]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать sql запрос  [new]
aleks2
Guest
declare @t table(N int,T datetime,D int, primary key clustered (N,T));

insert @t
SELECT * FROM 
(VALUES
(25623,'20130620 14:30',5)
,(25621,'20130620 14:31',5)
,(25622,'20130620 14:32',5)
,(25624,'20130620 14:33',5)
,(25625,'20130620 14:34',5) 
,(25625,'20130620 17:34',10) 
,(25624,'20130620 17:53',7)
) as T(N,T,D);

declare @be table(N int, T datetime, E int, primary key clustered (T, N) );

insert @be
select N, T, 1 from @t
union all
select N, dateadd(minute, D, T), -1 from @t;

select t1.T, sum(t2.E)
  from @be t1 inner join @be t2 on t2.T <= t1.T
  group by t1.T, t1.N
  order by t1.T
;
26 июн 13, 13:44    [14486197]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать sql запрос  [new]
Добрый Э - Эх
Guest
Ну, раз все "нафталиновые" решения продемонстрировали, то можно и нанотехнологии (как любят выражаться некоторые тут отметившиеся ;)) показать:
--
-- Тестовые данные:
WITH
  CTE AS
   ( SELECT * 
       FROM (
              VALUES (25623,'20130620 14:30',5),
                     (25621,'20130620 14:31',5),
                     (25622,'20130620 14:32',5),
                     (25624,'20130620 14:33',5),
                     (25625,'20130620 14:34',5)
            )T(N,T,D)
   )
--
-- Основной запрос (как всегда, наличие MS SQL Server - обязательно)
select top 1
       sum(inc) over(order by t) as x_max
  from ( -- Тут можно прикрутить UNPIVOT, но мне лениво:
         select t.t, 1 as inc from cte t
          union all
         select DATEADD(mi, t.D, t.T), - 1 from cte t
       ) v0
order by x_max desc
On-line проверка на sqlfiddle.com
26 июн 13, 14:01    [14486370]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать sql запрос  [new]
Добрый Э - Эх
Guest
Версию сервера не дописал:
Добрый Э - Эх
...
-- Основной запрос (как всегда, наличие MS SQL Server 2012 - обязательно)
...

;)
26 июн 13, 14:03    [14486386]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать sql запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Добрый Э - Эх
iap,

Подход, конечно, интересный. Но в корне неверный.
Для примера на таких данных затестируй:
WITH
  CTE AS(
    SELECT * 
      FROM(
            VALUES(25623,'20130620 14:00',50),
                  (25621,'20130620 14:10',1),
                  (25622,'20130620 14:20',1),
                  (25624,'20130620 14:30',1),
                  (25625,'20130620 14:40',1)
          )T(N,T,D))
SELECT TOP(1) WITH TIES T.N, T.T,
(
 SELECT COUNT(*)
 FROM CTE TT
 WHERE TT.T<=DATEADD(MINUTE,T.D,T.T) AND DATEADD(MINUTE,TT.D,TT.T)>=T.T
) C
FROM CTE T
ORDER BY C DESC;


Вроде видно, что более двух разговоров одновременно не было... А запрос показывает совсем другое ;).
Точно! Период может пересекаться с несколькими, которые не пересекаются между собой.
Ну дык дальше надо пилить
26 июн 13, 14:10    [14486453]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать sql запрос  [new]
foxtv
Member

Откуда:
Сообщений: 108
Добрый Э - Эх,

А для MS SQL Server 2000
26 июн 13, 14:10    [14486454]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать sql запрос  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
foxtv
Добрый Э - Эх,

А для MS SQL Server 2000

14486197
26 июн 13, 14:11    [14486471]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить