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

Откуда: Киев
Сообщений: 152
есть sql2000
есть таблица со структурой:
CREATE TABLE [Eagle_TelephoneData] (

[Date_Time] [datetime] NULL ,
[Line] [int] NULL ,
[Internal_Number] [decimal](6, 0) NULL ,
[Ringing_Long] [bigint] NULL ,
[Talking_Long] [bigint] NULL ,
[Total_Long] AS ([Ringing_long] + [talking_long]) ,
[Number_Calling_To] [char] (25) NULL ,
[Impulse_Tarification] [decimal](11, 0) NULL ,
[Info_Element] [decimal](2, 0) NULL ,
[Project_Code] [decimal](11, 0) NULL ,
[MSN] [decimal](11, 0) NULL ,
[Busy_Code] [decimal](5, 0) NULL ,
[LCR_map] [decimal](2, 0) NULL ,
[fin] [char] (7) NULL
) ON [PRIMARY]
GO


как получить запрос о том в какое время каналы были заняты?
тоесть с сортировкой по убыванию - чтобы наиболее загруженное время (когда максимальное количество Line было занято)?
21 янв 03, 18:55    [111593]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформулировать запрос  [new]
Bear_
Member

Откуда: Киев
Сообщений: 152
прошу помочь, сам уже копья все поломал
21 янв 03, 19:04    [111600]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформулировать запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
Читали Группировка отрезков времени ?
21 янв 03, 19:11    [111608]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформулировать запрос  [new]
Bear_
Member

Откуда: Киев
Сообщений: 152
немного мудрено там
попробую разобраться, но если Вам не трудно - черкните парой строк хоть в каком направлении...

в идеале вижу таблицу КвоЛиний\КвоМинутВДне - получив которую можно проссуммировать 1цы (если минута была занята) и сгруппировав по моменту времени и отсортировав по убыванию получу необходимый результат - я прав?
21 янв 03, 19:23    [111621]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформулировать запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
Вот тут вроде бы что-то похожее обсуждали https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=16572
21 янв 03, 19:42    [111637]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформулировать запрос  [new]
Bear_
Member

Откуда: Киев
Сообщений: 152
вот такой код получился на данном этапе:
-- очистим начальную таблицу


delete from Eagle_LinePerSecond

-- дата начальная

declare @currdate datetime
set @currdate = convert(datetime,'2002-01-01')
--select @currdate

-- количество секунд за 2 года (2002-2003)

declare @seconds int
set @seconds = DATEDIFF(second, @currdate, dateadd(year,2,@currdate))
--select @seconds


WHILE @seconds>0 BEGIN
INSERT INTO Eagle_LinePerSecond (date_time)
VALUES (dateadd(second,@seconds,@currdate))
set @seconds=@seconds-1
END

select * from Eagle_LinePerSecond

НО! почему медленно идет вставка? что может помочь?
22 янв 03, 11:13    [111906]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформулировать запрос  [new]
Bear_
Member

Откуда: Киев
Сообщений: 152
переформулирую:
что можно изменить(думаю отключить) чтобы вставка происходила быстрее?
22 янв 03, 11:20    [111922]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформулировать запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
Быстро и медленно понятия относительные.

количество секунд за 2 года (2002-2003) составит около 63 072 000 записей.
И во сколько вы оцениеваете время выполнения 63 072 000 INSERT-ов на вашем сервере ?
22 янв 03, 11:31    [111944]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформулировать запрос  [new]
Bear_
Member

Откуда: Киев
Сообщений: 152
за 28 минут - 2017763 строк вставлено
итого 875 минут %(
что делать?
решил потом таким вот апдейтом заполнять таблицу:
update Eagle_LinePerSecond

set Count_Line=
(select sum(stamp)
from Eagle_TelephoneData
where Eagle_TelephoneData.date_time<=Eagle_LinePerSecond.Date_time
and Eagle_TelephoneData.date_time_end>=Eagle_LinePerSecond.Date_Time)

и уже анализируя ее получить данные о загруженноси линий в конкретный момент...
22 янв 03, 11:41    [111964]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформулировать запрос  [new]
Bear_
Member

Откуда: Киев
Сообщений: 152
ВЫРУЧАЙТЕ!
Вы же знаете как правильно...
22 янв 03, 11:46    [111977]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформулировать запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
Да я просто не пойму - зачем вам строить таблицу с 63 000 000 записей ???
22 янв 03, 11:51    [111987]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформулировать запрос  [new]
Bear_
Member

Откуда: Киев
Сообщений: 152
чтобы потом запросом можно было за любую дату увидеть в какие секунды были максимальные пики загрузки (поле Count_Line)

вот структура таблицы:
CREATE TABLE [Eagle_LinePerSecond] (

[Date_Time] [datetime] NULL ,
[Count_Line] [int] NULL
) ON [PRIMARY]
GO
22 янв 03, 11:57    [111997]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформулировать запрос  [new]
Bear_
Member

Откуда: Киев
Сообщений: 152
ткните меня носом - "Дурак, мол, надо не так, а так"
я только спасибо скажу :)
22 янв 03, 11:59    [112007]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформулировать запрос  [new]
Bear_
Member

Откуда: Киев
Сообщений: 152
неужели это настолько сложный вопрос?
22 янв 03, 12:13    [112031]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформулировать запрос  [new]
sparrow
Member

Откуда: Россия, Красноярск.
Сообщений: 21759
может примерно так:

create table #Eagle_LinePerSecond (Date_time datetime)
declare @currdate datetime
set @currdate = convert(datetime,'2002-01-01')

-- для начала 10000 строк (можно и меньше)

declare @seconds int
set @seconds = 10000
WHILE @seconds>0 BEGIN
INSERT INTO #Eagle_LinePerSecond (date_time)
VALUES (dateadd(second,@seconds,@currdate))
set @seconds=@seconds-1
END

declare @InsertSec int, @i int
set @InsertSec = DATEDIFF(second, @currdate, dateadd(year,2,@currdate))
set @i=10000
-- теперь остальное

WHILE @i<@InsertSec BEGIN
INSERT INTO #Eagle_LinePerSecond (date_time)
SELECT dateadd(second,-@i,date_time) FROM #Eagle_LinePerSecond
SET @i=@i*2
END


У меня за 5 минут получилось 10 240 000 строк

PS.Будь поосторожней с таким батчем - место на дисках быстро кончается...
sparrow
22 янв 03, 13:36    [112189]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформулировать запрос  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
а какого объёма Eagle_TelephoneData?
если она меньше чем 63 072 000 записей, то может стоит выбрать временные интерваля из неё?
22 янв 03, 14:04    [112251]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформулировать запрос  [new]
Bear_
Member

Откуда: Киев
Сообщений: 152
по поводу батча - сейчас пробую
по поводу выбора интервала задействованных записей - нехватает умишки для
такой операции...
22 янв 03, 14:14    [112277]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформулировать запрос  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
да тут много ума и не надо
 

create table #interv(d datetime)

insert #d -- это выбранные моменты

select distinct Date_Time from Eagle_TelephoneData
union select distinct dateadd(ss,Date_Time, Total_Long) from Eagle_TelephoneData

-- теперь надо подсчитать количество звонков на каждый момент


select d, count(*) с
from #d d, Eagle_TelephoneData e
where d between Date_Time and dateadd(ss,Date_Time, Total_Long)
group by d
order by c desc
22 янв 03, 14:36    [112337]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить