• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Запрос с частичной условной агрегацией...

  • Автор темы Lunatikus
  • Дата начала
Статус
Закрыто для дальнейших ответов.
L

Lunatikus

База MSSQL 2000.

Есть набор данных по запросу ADOQuery,в котором одно из полей-дата.Есть другая таблица в базе,в которой также одно из полей-дата.Мне надо агрегировать поле ADOQuery.fields[0].asfloat по всем датам,попадающим в определенный интервал,который считается по второй таблице:c Table.fieldbyname('data')-7дней по Table.fieldbyname('data')+7дней.Т.е. говоря проще,надо суммировать значение строк из запроса у которых даты попадают в определенный интервал,находимый из другой таблицы.С датами у меня проблемы-поиск не помогает.И второй момент-можно ли сделать запрос из ADOQuery?
 
B

Barmutik

Что значит поиск не помогает? Так что операция SUM не рабоатет или в чём конкретно проблема?
 
L

Lunatikus

Поиск ответа на данный вопрос по нету и по офруму в частности.Проблема конкретно в том что я:1)не знаю как задать условие на интервал даты 2)не знаю,можно ли делать запрос на основе ADOQuery и елси да то как?
 
B

Barmutik

Хммм...

Код:
AdoQuery.Close;
AdoQuery.SQL.Text :=
...MyDate >= :StartDate AND MyDate <= :EndDate...

AdoQuery.Parameters.ParamByName('StartDate').Value := Date - 2;
AdoQuery.Parameters.ParamByName('EndDate').Value := Date;
AdoQuery.Open;

Вот Вам задание диапазона от позавчера до сегодня...
 
L

Lunatikus

а если не днями отнимать а месяцами?
И мне надо не заменять внутренность запроса,а использовать полученный с помощью него набор данных и к нему применять новый запрос с этими условиями.
 
S

SNike

Вероятно, вложенные запросы помогут тебе :)
 
L

Lunatikus

Мда?В первом запорсе впыолняется множество действий,результат которых-запись в базу данных.Время впыолнения запроса-примерно 2-2,5 часа.Операция должна быть выполнена единожды,так что это не таккая уж проблема.Проблема в том,что полученный набор данных в кэше после выполнения запроса надо еще обработать и получить другую выборку без занесения в базу и время выполнения его будет горррррраздо меньше.Так разве есть смысл вставлять нужный запрос в старый,чтобы сделать все сразу?
 
S

SNike

А что мешает делать все это разными запросами, или же, к примеру, создать временную таблицу?
 
L

Lunatikus

Вот мне и интересно как сделать отдельный запрос,который будет использовать данные выполненного ADOQuery?Визуально и ручками.
 
S

SNike

Стоит ли все усложнять? Есть ведь StoredProc, можно создать временную таблицу, разбить один большой запрос на несколько поменьше...
Сложно что-то сказать не зная самой цели и того, что должно происходить в запросах
 
L

Lunatikus

Почитаю про storedproc-я пока не знаю ничего об этом компоненте.К тому же вопрос лишь в техническом плане:можно ли сделать еще один ADOQuery2 на основе старого ADOQuery1 типа
ADOQuery2.SQL.text:='SELECT * FROM ADOQuery1';Ясное дело что тако нельзя.А как можно?
 
S

SNike

StoredProc - хранимые процедуры. Это не компоненты. Почитай по языку SQL, там много чего интересного есть ;)
На счет "Как можно?" - все же использование промежуточных таблиц, или, что скорее всего, выбор другого варианта решения поставленной задачи :)
 
L

Lunatikus

Насчет временной таблицы:
SQL.Clear;
SQL.Add(.... внутренний SQL);
SQL.Open;
DbiMakePermanent(handle, 'temp.db',true);
SQL.Clear;
SQL.Add(SELECT ... FROM 'temp.db'....);
SQL.Open;

Так?
А насчет хранимых процедур-я просто видел такой компонент-ADOStoredProc.Не было нужды разбираться.Но раз ты советуешь,посмотрю.
 
B

Barmutik

Что-то я не допонял вот это вот применительно к MS SQL 2000

DbiMakePermanent(handle, 'temp.db',true);

Время выполнения запроса в 2.5 часа говорит о неверной организации данных в БД.... или не верной организации запроса ...
 
S

SNike

Да, что-то не так, слишком долго. Собстно, как и говорилось:
<!--QuoteBegin-SNike+10:07:2007, 16:46 -->
<span class="vbquote">(SNike @ 10:07:2007, 16:46 )</span><!--QuoteEBegin-->или, что скорее всего, выбор другого варианта решения поставленной задачи
[snapback]71925" rel="nofollow" target="_blank[/snapback]​
[/quote]
 
L

Lunatikus

to Barmutik:
у меня MS SQL 2002.Что к нему применительно?
Насчет времени выполнения-повторюсь-операция разовая для наполнения базы.Запрос просто большой(с возвратами по строкам).

to SNike:
Мне сейчас интересно,как сделать временную таблицу и сохранить в ней полученный набор данных,чтобы осуществить еще один запрос.
 
S

SNike

Думаю, что можно использовать и подзапросы. Например,
select * from (select * from My_table)

Можно временные таблицы, но у них есть понятие "время жизни", так что стоит подумать использовать их или предварительно почитать книжки

Как альтернатива - SELECT .... INTO ....



<!--QuoteBegin-Lunatikus+11:07:2007, 16:11 -->
<span class="vbquote">(Lunatikus @ 11:07:2007, 16:11 )</span><!--QuoteEBegin-->MS SQL 2002
[snapback]72033" rel="nofollow" target="_blank[/snapback]​
[/quote]

В первом посте говорилось <!--QuoteBegin-Lunatikus+9:07:2007, 16:49 -->
<span class="vbquote">(Lunatikus @ 9:07:2007, 16:49 )</span><!--QuoteEBegin-->База MSSQL 2000.

[snapback]71792" rel="nofollow" target="_blank[/snapback]​
[/quote]

:)
 
B

Barmutik

Ну создавайте локальную или глобальную временную таблицу на сервере .. что конкретно интересно?

Просто я как-то слабо верю что одиночный запрос МС СКЛ сервер будет 2.5 часа отрабатывать ... да он дропнет конекшин раньше .. хотя я конечно не знаю максимального времени таймаута для запроса.. может там и можно выставить 2.5 часс.. по умолчанию ж вроде 30 сек...

Да и про MS SQL Server 2002 ...как-то я не в курсе про такой .. 6, 6.5, 2000, 2005, 2008 ... а вот 2002 .. это для меня что-то новое ... :D
 
L

Lunatikus

Ошибся,конечно,совсем старый стал...версия 2000.У меня не запрос 2,5 часа выполняется,сорь,некорректно сформулировал.У меня действие по заполнению базы столько выполняется.Там программный цикл,в котором с каждым сдвигом строки по выполненному запросу выполняется ряд вычислений(в том числе со сдвигом строк назад и снова вперед) и полученные данные в виде update заносятся в базу.Так вот после данной операции мне и надо было взять полученный набор данных и к нему применить...елки-палки лес густой....во туплю...почему то все время считал что надо это делать во время выполнения этой громадной операции по начальному созданию базы....ведь можно же в конце...в виде простенького запроса....дурак....простите,что отнял время =(( и никакой временной таблицы не надо... :) пора мне отдохнуть от работы...
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!