Есть таблика подключений где указывается время подключения (UTC в секундах) (не длина подключения, а время начала подключения),
создать запрос, который возвращал бы выборку, каждой строчкой которой является число подключений за интервал времени с шагом
на входе StartDate и EndDate и шаг в секундах Step.
то есть от StartDate до EndDate с шагом Step 8 итераций (временных интервалов), значит 8 сток в выборке, в каждой число подключений за в данном интервале времени (CurrentDate < время < CurrentDate + Step).
не пойму... название что ли?
есть в БД MSSQL таблица recordsDetails, в ней есть колонки какие-то, это тут не важно. Среди этих колонок есть колонка ConnectionStart (integer — секунды от 1970 года)
надо выбрать для каждого интервала от @StartDate До @EndDate с шагом Step колличество подключений, инициированных в каждом из интервалов.
Здравствуйте, nfnf, Вы писали:
AC>>А какой?
N>не пойму... название что ли?
Нда... Тяжелый случай... Для информации, MS SQL может быть разных версий. Более того, эти версии еще сервис паки имеют. (Вот проклятый Билл Гейтс замутил). Например, версии такие: 6.5, 7.0, 8.0 (2000), 9.0 (2005)
___>Нда... Тяжелый случай... Для информации, MS SQL может быть разных версий. Более того, эти версии еще сервис паки имеют. (Вот проклятый Билл Гейтс замутил). Например, версии такие: 6.5, 7.0, 8.0 (2000), 9.0 (2005)
ну что за флуд... для решения такой задачи, я думаю номер версии тааак сильно принципиален, а при условии, что сейчас 70% решается на 8.0 20% на 9.0... и для данной задачи отличия 8.0 от 9.0 так координальны... разводить флуд на тему версий.. крайне важно
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
Здравствуйте, 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
Здравствуйте, Inco, Вы писали:
___>>Нда... Тяжелый случай... Для информации, MS SQL может быть разных версий. Более того, эти версии еще сервис паки имеют. (Вот проклятый Билл Гейтс замутил). Например, версии такие: 6.5, 7.0, 8.0 (2000), 9.0 (2005)
I>ну что за флуд... для решения такой задачи, я думаю номер версии тааак сильно принципиален, а при условии, что сейчас 70% решается на 8.0 20% на 9.0... и для данной задачи отличия 8.0 от 9.0 так координальны... разводить флуд на тему версий.. крайне важно
Это не флуд и это важно. И отличия вобще-то могут быть кардинальны
Здравствуйте, 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, если считать что деление целочисленное
Здравствуйте, 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, если считать что деление целочисленное
Здравствуйте, 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)