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

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

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

2. Другой вариант решения поставленной задачи. Генерируем полный набор секунд за интересуемый период времени, пересекаем результат генерации со звонками, группируем по секундам, находим секунду с максимальным количеством повторений. ;)
...
Рейтинг: 0 / 0
26.06.2013, 13:27
    #38311158
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать sql запрос
Код: 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
26.06.2013, 13:38
    #38311186
Помогите написать sql запрос
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
26.06.2013, 13:38
    #38311188
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать sql запрос
Добрый Э - Эх, да во втором варианте все секунды не нужны, достаточно начала разговоров взять за опорную таблицу

Код: 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
26.06.2013, 13:44
    #38311202
aleks2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать sql запрос
Код: 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
26.06.2013, 14:01
    #38311239
Помогите написать sql запрос
Ну, раз все "нафталиновые" решения продемонстрировали, то можно и нанотехнологии (как любят выражаться некоторые тут отметившиеся ;)) показать:
Код: 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
26.06.2013, 14:03
    #38311241
Помогите написать sql запрос
Версию сервера не дописал:
Добрый Э - Эх
Код: sql
1.
2.
3.
...
-- Основной запрос (как всегда, наличие MS SQL Server 2012 - обязательно)
...


;)
...
Рейтинг: 0 / 0
26.06.2013, 14:10
    #38311254
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать sql запрос
Добрый Э - Эх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
26.06.2013, 14:10
    #38311255
foxtv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать sql запрос
Добрый Э - Эх,

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

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


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