powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите написать sql запрос
25 сообщений из 29, страница 1 из 2
Помогите написать sql запрос
    #38310824
foxtv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица с номерами телефонов, время начала разговора, длительность разговора . Каким образом найти максимальное количество одновременно звонящих телефонов.
...
Рейтинг: 0 / 0
Помогите написать sql запрос
    #38310826
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Помогите написать sql запрос
    #38310834
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
foxtvЕсть таблица с номерами телефонов, время начала разговора, длительность разговора . Каким образом найти максимальное количество одновременно звонящих телефонов.А где время начала звонка телефона, время конца звонка телефона?
...
Рейтинг: 0 / 0
Помогите написать sql запрос
    #38310854
foxtv, тут тебе нужен unpivot + накопительный итог.
Основная идея такая:
1) начала и кончала (кончало = начало + длительность) развернуть в таблицу, вида: дата_события, тип_события. Где дата события, естественно, либо начало, либо кончало. Ну атип, понятное дело, как таз и будет описывать что именно за дата у нас - начало или кончало. Для простоты можно брать +1 для начала разговора и -1 для его кончала. А дальше - дело техники. Накопительным итогом считаем сумму типов_событий. Каждый начавшийся разговор добавит единицу к одновременным звонкам, каждое кончало - отнимет её. После это останется лишь найти максимальное из значений накопительной суммы. :)
...
Рейтинг: 0 / 0
Помогите написать sql запрос
    #38310863
сумму считаем в отсортированном множестве разговоров в порядке: дата_начала, длительность. :)
...
Рейтинг: 0 / 0
Помогите написать sql запрос
    #38311031
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 телефонов которые одновременно занимали линию
...
Рейтинг: 0 / 0
Помогите написать sql запрос
    #38311040
Фотография Сергей Викт.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
foxtviap,
Номер телефона----Время начала разговора----Длительность (минуты)
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 телефонов которые одновременно занимали линию
одновременно занимали линию за какой промежуток то? В какое время? Требования какие?
...
Рейтинг: 0 / 0
Помогите написать sql запрос
    #38311041
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а номер линии где ?
...
Рейтинг: 0 / 0
Помогите написать sql запрос
    #38311045
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
думаю, iap имел в виду, что даже если разговор еще не начался, линия уже занята
(абонент А слышит гудки пока абонент Б бежит из кухни к телефону:)
...
Рейтинг: 0 / 0
Помогите написать sql запрос
    #38311055
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Паганельдумаю, iap имел в виду, что даже если разговор еще не начался, линия уже занята
(абонент А слышит гудки пока абонент Б бежит из кухни к телефону:)Я имел в виду, что хорошо бы сформулировать задачу на русском языке.
Всё-таки, "одновременно звонящих телефонов" - как это понимать без дополнительных пояснений?
...
Рейтинг: 0 / 0
Помогите написать sql запрос
    #38311056
foxtv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Викт.,
Неважно за какой промежуток, неважно какая линия. Вопрос в том чтобы определить максимальную нагрузку, т.е. максимальное количество людей звонящих в одно и то же время.
...
Рейтинг: 0 / 0
Помогите написать sql запрос
    #38311059
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
foxtvСергей Викт.,
Неважно за какой промежуток, неважно какая линия. Вопрос в том чтобы определить максимальную нагрузку, т.е. максимальное количество людей звонящих в одно и то же время. http://ru.wikipedia.org/wiki/Эрланг
...
Рейтинг: 0 / 0
Помогите написать sql запрос
    #38311060
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
foxtvСергей Викт.,
Неважно за какой промежуток, неважно какая линия. Вопрос в том чтобы определить максимальную нагрузку, т.е. максимальное количество людей звонящих в одно и то же время.
14484780
...
Рейтинг: 0 / 0
Помогите написать sql запрос
    #38311065
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, задача на пересечение промежутков времени?
Но ведь 5 телефонов из примера занимали линии одновременно не всегда.
Были моменты, когда один из них соединился, а остальные - нет.
А были моменты, когда таких было 3.
Снова непонятно что же нужно?
...
Рейтинг: 0 / 0
Помогите написать sql запрос
    #38311088
foxtv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iap,

В данном примере в интервале 14:30 - 14:35 - занимали линию все пять телефонов и неважно со скольки каждый начинал разговор с 14:31 или 14:34.
...
Рейтинг: 0 / 0
Помогите написать sql запрос
    #38311092
foxtv,

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

2. Другой вариант решения поставленной задачи. Генерируем полный набор секунд за интересуемый период времени, пересекаем результат генерации со звонками, группируем по секундам, находим секунду с максимальным количеством повторений. ;)
...
Рейтинг: 0 / 0
Помогите написать sql запрос
    #38311158
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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;
...
Рейтинг: 0 / 0
Помогите написать sql запрос
    #38311186
iap,

Подход, конечно, интересный. Но в корне неверный.
Для примера на таких данных затестируй:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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;


Вроде видно, что более двух разговоров одновременно не было... А запрос показывает совсем другое ;).
...
Рейтинг: 0 / 0
Помогите написать sql запрос
    #38311188
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эх, да во втором варианте все секунды не нужны, достаточно начала разговоров взять за опорную таблицу

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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;
...
Рейтинг: 0 / 0
Помогите написать sql запрос
    #38311202
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
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
;
...
Рейтинг: 0 / 0
Помогите написать sql запрос
    #38311239
Ну, раз все "нафталиновые" решения продемонстрировали, то можно и нанотехнологии (как любят выражаться некоторые тут отметившиеся ;)) показать:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
--
-- Тестовые данные:
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
...
Рейтинг: 0 / 0
Помогите написать sql запрос
    #38311241
Версию сервера не дописал:
Добрый Э - Эх
Код: sql
1.
2.
3.
...
-- Основной запрос (как всегда, наличие MS SQL Server 2012 - обязательно)
...


;)
...
Рейтинг: 0 / 0
Помогите написать sql запрос
    #38311254
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эхiap,

Подход, конечно, интересный. Но в корне неверный.
Для примера на таких данных затестируй:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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;



Вроде видно, что более двух разговоров одновременно не было... А запрос показывает совсем другое ;).Точно! Период может пересекаться с несколькими, которые не пересекаются между собой.
Ну дык дальше надо пилить
...
Рейтинг: 0 / 0
Помогите написать sql запрос
    #38311255
foxtv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

А для MS SQL Server 2000
...
Рейтинг: 0 / 0
Помогите написать sql запрос
    #38311259
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
foxtvДобрый Э - Эх,

А для MS SQL Server 2000
14486197
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите написать sql запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]