![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SQL запрос
Tonich © (2007-07-11 12:00:00)Привет...
помоги построить запрос...
есть данные в таблице -временные срезы показаний со счетчика. Они могут быть записанные через разный интервал времени, (час год, день неделя) так вот необходимо построить запрос который бы возвращал данные в определенном интервале (это уже сделал) и c определенным шагом по времени (заданным пользователем, а не таким как он есть в базе)
спасибо...
clickmaker (2007-07-11 14:45:00) [1]
> [22] Tonich © (11.07.07 14:42)
это MS SQL.
но вообще-то в этом запросе ничего особо специфичного нет, только вычисление разницы дат подставить вместо минуса
в MS SQL datediff(hour, d1, d2)
% - остаток от деления
Tonich (2007-07-11 14:42:00) [2]
> clickmaker © (11.07.07 14:10) [19]
я синтаксиса MySQL не знаю
ну то есть в общем я понял что идет выборака между заданным интревалом
> % @interval = 0
а вот это что значить ?
@interval это помоему так обозначаются там переменные если я не ошибаюсь а % что там означает?
clickmaker (2007-07-11 14:29:00) [3]
> [20] Johnmen © (11.07.07 14:22)
почему? там надо что-то типа datediff еще добавить и всё
Johnmen (2007-07-11 14:22:00) [4]
> clickmaker © (11.07.07 14:10) [19]
Это не то, что автору надо.
clickmaker (2007-07-11 14:10:00) [5]
> [18] Tonich © (11.07.07 13:43)
так а чё, [10] не подходит?
Tonich (2007-07-11 13:43:00) [6]
> Ибо очень как-то не верится, что данные будут заноситься
> ровно через час с точностью до секунды.
а никто и не утверждал что так будет на деле...
> хммм ну ща с импровизируем ))
> допустим вот такие вот есть данные в базе
ЮЮ (2007-07-11 13:32:00) [7]
> что ж делать, если это недостаток выборки данных со счетчика?
> ?
Выполнить аппрокимацию по ближайщим данным до и ближайшим после после. Ибо очень как-то не верится, что данные будут заноситься ровно через час с точностью до секунды.
Или требованиея изложить иначе.
Например на данных
Есть
12/01/2007 15:32:25 15.3546
12/01/2007 22:35:25 15.7896
если шаг по времени скажет 3 часа надо получить следующие результаты
12/01/2007 15:32:25 15.3546
12/01/2007 18:32:25 ???
12/01/2007 21:32:25 ???
Tonich (2007-07-11 13:22:00) [8]
> Desdechado © (11.07.07 13:15) [15]
ну правильно в некоторый шагай дынных просто не будет... а на что это повлияет???
то что не будет четкого временного шага между показанными данными???
то есть если я укажу неделю, то каждая последующая запись должна отстоять на неделю...
по-моему тут нет проблемы, что ж делать, если это недостаток выборки данных со счетчика??
Desdechado (2007-07-11 13:15:00) [9]> и как бы очевидно что шаг не может быть больше чем заданный интервал,
Зато в интервале может быть 5 шагов, в некоторых из которых данных просто нет.
Tonich (2007-07-11 13:08:00) [10]
> А если у тебя в этом шаге не будет данных?
ну первый критерий получения данных это попадание их в заданный временной интервал, и как бы очевидно что шаг не может быть больше чем заданный интервал, поэтому если данные не попали уже в первый отбор то естественно из там не буит... ну а если их нет в этом интервале времени значить из нет ...
> А если внутри будет несколько?
несколько чего, несколько записей? ну и ради бога...
> А если что-то попадет на границу периода?
а вот это пока не решил...
Desdechado (2007-07-11 13:02:00) [11]> а я хочу задать определенный шаг по времени скажет 3 часа
> и получить следующие результаты
А если у тебя в этом шаге не будет данных?
А если внутри будет несколько?
А если что-то попадет на границу периода?
Johnmen (2007-07-11 12:44:00) [12]
> Tonich © (11.07.07 12:37) [9]
В цикле выборки в заданном интервале времени анализируешь, надо ли включать тек.запись в результат на основании того, входит ли время тек.зап. в текущий "шаг". "Шаг", ес-но, наращивается в цикле.
Сергей М. (2007-07-11 12:37:00) [13]
> Tonich © (11.07.07 12:27) [7]
> знаю какие функции надо задействовать я не знаю как
>
И какие же ?
clickmaker (2007-07-11 12:37:00) [14]на MS SQL я бы так написал
select t1.*
from tab t1
where isnull((t1.value - (select min(t2.value ) from tab t2 where t2.value < t1.value )), 0) % @interval = 0
диалекта IB не знаю
Tonich (2007-07-11 12:37:00) [15]
> Johnmen © (11.07.07 12:32) [8]
ну так я так и начал делать она уже написана на половину, то есть выбирает данные в заданном интервале времени. осталось только дописать то как ей выбирать с определенным шагом
Johnmen (2007-07-11 12:32:00) [16]>Tonich ©
Самое разумное - написать ХП.
Tonich (2007-07-11 12:27:00) [17]
> Сергей М. © (11.07.07 12:21) [5]
совершенно верно
> MsGuns © (11.07.07 12:25) [6]
нет ну я не такой уж дилетант, я знаю какие функции надо задействовать я не знаю как
MsGuns (2007-07-11 12:25:00) [18]Help->Local SQL
Читать агрегатные операции, а также преобразование дат и синтаксис SELECT (Where .. BETWEEN в частности)
Сергей М. (2007-07-11 12:21:00) [19]
> Tonich © (11.07.07 12:00)
Т.е. ты не хочешь тащить вседанные на клиента и уже там их фильтровать, а хочешь сформировать требуемый НД прямо на сервере.
Я правильно понял ?
Tonich (2007-07-11 12:13:00) [20]IB