Не могу придумать запрос
От: nfnf  
Дата: 13.08.06 14:10
Оценка:
Есть таблика подключений где указывается время подключения (UTC в секундах) (не длина подключения, а время начала подключения),
создать запрос, который возвращал бы выборку, каждой строчкой которой является число подключений за интервал времени с шагом
на входе StartDate и EndDate и шаг в секундах Step.

то есть от StartDate до EndDate с шагом Step 8 итераций (временных интервалов), значит 8 сток в выборке, в каждой число подключений за в данном интервале времени (CurrentDate < время < CurrentDate + Step).

Большое спасибо всем, кто отзовётся.
Re: Не могу придумать запрос
От: Alex.Che  
Дата: 13.08.06 14:19
Оценка:
Привет, nfnf!
Вы пишешь 13 августа 2006:

n> Есть таблика подключений...


Где ?

--
With best regards, Alex Cherednichenko.
Posted via RSDN NNTP Server 2.0
Re[2]: Не могу придумать запрос
От: nfnf  
Дата: 13.08.06 14:23
Оценка:
Здравствуйте, Alex.Che, Вы писали:

n>> Есть таблика подключений...


AC>Где ?


ой.. забыл MSSQL
Re[3]: Не могу придумать запрос
От: Alex.Che  
Дата: 13.08.06 14:29
Оценка:
Привет, nfnf!
Вы пишешь 13 августа 2006:

n>>> Есть таблика подключений...


AC>> Где ?


n> ой.. забыл MSSQL


А какой?

--
With best regards, Alex Cherednichenko.
Posted via RSDN NNTP Server 2.0
Re[4]: Не могу придумать запрос
От: nfnf  
Дата: 13.08.06 14:49
Оценка:
AC>А какой?

не пойму... название что ли?
есть в БД MSSQL таблица recordsDetails, в ней есть колонки какие-то, это тут не важно. Среди этих колонок есть колонка ConnectionStart (integer — секунды от 1970 года)
надо выбрать для каждого интервала от @StartDate До @EndDate с шагом Step колличество подключений, инициированных в каждом из интервалов.

Чтобы
[@StartDate; @StartDate + @Step] — 4 (connections)
[@StartDate + @Step; @StartDate + 2*@Step] — 23 (connections)
[@StartDate + 2*@Step; @StartDate + 3*@Step] — 6 (connections)
...
[@StartDate + N*@Step; @EndDate) — 17(connections)

Re[5]: Не могу придумать запрос
От: AMogil Россия  
Дата: 13.08.06 21:06
Оценка: 1 (1)
Здравствуйте, nfnf, Вы писали:


N>Чтобы

N>[@StartDate; @StartDate + @Step] — 4 (connections)
N>[@StartDate + @Step; @StartDate + 2*@Step] — 23 (connections)
N>[@StartDate + 2*@Step; @StartDate + 3*@Step] — 6 (connections)
N>...
N>[@StartDate + N*@Step; @EndDate) — 17(connections)

N>


Например, так:

declare @step int, @start int
set @step = 400
set @start = 0
select count(F / @step) from Table1 where F > @start group by (F / @step)
Re[5]: Не могу придумать запрос
От: _d_m_  
Дата: 14.08.06 03:05
Оценка:
Здравствуйте, nfnf, Вы писали:

AC>>А какой?


N>не пойму... название что ли?


Нда... Тяжелый случай... Для информации, MS SQL может быть разных версий. Более того, эти версии еще сервис паки имеют. (Вот проклятый Билл Гейтс замутил). Например, версии такие: 6.5, 7.0, 8.0 (2000), 9.0 (2005)
Re[6]: Не могу придумать запрос
От: Inco  
Дата: 14.08.06 07:19
Оценка: +1
___>Нда... Тяжелый случай... Для информации, MS SQL может быть разных версий. Более того, эти версии еще сервис паки имеют. (Вот проклятый Билл Гейтс замутил). Например, версии такие: 6.5, 7.0, 8.0 (2000), 9.0 (2005)

ну что за флуд... для решения такой задачи, я думаю номер версии тааак сильно принципиален, а при условии, что сейчас 70% решается на 8.0 20% на 9.0... и для данной задачи отличия 8.0 от 9.0 так координальны... разводить флуд на тему версий.. крайне важно
Re[7]: Не могу придумать запрос
От: Inco  
Дата: 14.08.06 07:38
Оценка:
Нашёл такое решение

declare @step int
set @step = " & sSeparator

declare @count int
declare @maxCount int SET @count = 0 SET @maxCount = ABS( DateDiff( second, @StartDate , @EndDate ) ) / @Step
WHILE (@count < @maxCount) BEGIN
SELECT COUNT(*) AS Counter FROM (
SELECT * FROM SomeTable WHERE
date > DATEADD( second, @step * @count, @StartDate ) AND
date < DATEADD( second, @step * (@count+1), @StartDate )) DERIVEDTBL
SET @count = @count + 1
END

правда только возвращает набор выборок...
Re: Не могу придумать запрос
От: alico  
Дата: 14.08.06 08:34
Оценка:
Здравствуйте, nfnf, Вы писали:

N>Есть таблика подключений где указывается время подключения (UTC в секундах) (не длина подключения, а время начала подключения),

N>создать запрос, который возвращал бы выборку, каждой строчкой которой является число подключений за интервал времени с шагом
N>на входе StartDate и EndDate и шаг в секундах Step.

N>то есть от StartDate до EndDate с шагом Step 8 итераций (временных интервалов), значит 8 сток в выборке, в каждой число подключений за в данном интервале времени (CurrentDate < время < CurrentDate + Step).


N>Большое спасибо всем, кто отзовётся.


Думаю что одним запросом здесь не обойтись (если только не создавать его динамически). Есть 2 варианта:
1. Тот, что предложил Inco, только результаты каждой выборки складывать во временную таблицу, затем селект из этой таблицы.
2. Сначала создать временную таблицу с интервалами, затем один селект:

DECLARE @date1 datetime, @date2 datetime
CRATE TABLE #interval
(int_start datetime primary key,
int_end datetime)

SET @date1 = @StartDate --начало первого интервала
SET @date2 = @date1 + (@EndDate - @StartDate)/@Step --конец первого интервала
WHILE (@date2 <= @EndDate)
BEGIN
  INSERT INTO #interval VALUES (@date1, @date2) --вставляем строку с началом и окончанием интервала
  SET @date1=@date2 --начало следующего интервала
  SET @date2 = @date1 + (@EndDate - @StartDate)/@Step --конец следующего интервала
END

--теперь можно делать селект
SELECT int_start, int_end, 
    (SELECT count(*) FROM Connections c WHERE c.ConnStart >= i.int_start AND c.ConnStart < i.int_end) ConnNum
FROM #interval i 

DROP TABLE #interval
Re[7]: Не могу придумать запрос
От: _d_m_  
Дата: 14.08.06 11:43
Оценка: 1 (1)
Здравствуйте, Inco, Вы писали:

___>>Нда... Тяжелый случай... Для информации, MS SQL может быть разных версий. Более того, эти версии еще сервис паки имеют. (Вот проклятый Билл Гейтс замутил). Например, версии такие: 6.5, 7.0, 8.0 (2000), 9.0 (2005)


I>ну что за флуд... для решения такой задачи, я думаю номер версии тааак сильно принципиален, а при условии, что сейчас 70% решается на 8.0 20% на 9.0... и для данной задачи отличия 8.0 от 9.0 так координальны... разводить флуд на тему версий.. крайне важно


Это не флуд и это важно. И отличия вобще-то могут быть кардинальны
Re[2]: Не могу придумать запрос
От: Alexey Frolov Беларусь  
Дата: 14.08.06 11:54
Оценка:
Здравствуйте, alico, Вы писали:

A>Думаю что одним запросом здесь не обойтись (если только не создавать его динамически).


А мне кажется можно попробовать обойтись одним запросом. По-моему это самое простое решение, оно уже прозвучало выше. Агрегирующий запрос с группировкой по функции. в общем виде выглядит так


select count(field) from table 
where date between start_date and end_date
group by f(start_date, date, step)


где f(...) — функция идентифицирующая к какому временному интервалу относится текущая дата
например (date — start_date) / step, если считать что деление целочисленное
Re[3]: Не могу придумать запрос
От: alico  
Дата: 14.08.06 11:58
Оценка:
Здравствуйте, Alexey Frolov, Вы писали:

AF>Здравствуйте, alico, Вы писали:


A>>Думаю что одним запросом здесь не обойтись (если только не создавать его динамически).


AF>А мне кажется можно попробовать обойтись одним запросом. По-моему это самое простое решение, оно уже прозвучало выше. Агрегирующий запрос с группировкой по функции. в общем виде выглядит так



AF>
AF>select count(field) from table 
AF>where date between start_date and end_date
AF>group by f(start_date, date, step)
AF>


AF>где f(...) — функция идентифицирующая к какому временному интервалу относится текущая дата

AF>например (date — start_date) / step, если считать что деление целочисленное

Согласен
Re[5]: Не могу придумать запрос
От: wildwind Россия  
Дата: 14.08.06 12:00
Оценка:
Здравствуйте, nfnf, Вы писали:

N>есть в БД MSSQL таблица recordsDetails, в ней есть колонки какие-то, это тут не важно. Среди этих колонок есть колонка ConnectionStart (integer — секунды от 1970 года)

N>надо выбрать для каждого интервала от @StartDate До @EndDate с шагом Step колличество подключений, инициированных в каждом из интервалов.

Так наверное:
select floor((ConnectionStart - @StartDate) / @Step) as interval,
       floor((ConnectionStart - @StartDate) / @Step) * @Step + @StartDate as int_start,
       (floor((ConnectionStart - @StartDate) / @Step) + 1) * (@Step) + @StartDate - 1 as  int_end,
       count(*) as connections,
  from recordsDetails
 where ConnectionStart between @StartDate and @EndDate
 group by floor((ConnectionStart - @StartDate) / @Step)

Или я не понял сложности задачи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.