powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Хитрый SQL запрос
14 сообщений из 14, страница 1 из 1
Хитрый SQL запрос
    #32648122
Johnny_lcool
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть таблица

Field1 Field2 Field3 (Date/Time) Field4(Value)
V0001SA ET9024 01.04.2003 0:03 387,10907
V0001SA ET9024 01.04.2003 0:04 389,642517
V0001SA ET9024 01.04.2003 0:05 390,668945
V0001SA ET9024 01.04.2003 0:09 387,63858
V0001SA ET9024 01.04.2003 0:10 390,937744
V0001SA ET9024 01.04.2003 0:16 387,443054
V0001SA ET9024 01.04.2003 0:17 390,677063
V0001SA ET9024 01.04.2003 0:20 389,023438
V0001SA ET9024 01.04.2003 0:20 390,180176
V0001SA ET9024 01.04.2003 0:23 387,402344
V0001SA ET9024 01.04.2003 0:24 390,180176
V0001SA ET9024 01.04.2003 0:30 387,133514
V0001SA ET9024 01.04.2003 0:31 389,952087
V0001SA ET9024 01.04.2003 0:36 387,174255
V0001SA ET9024 01.04.2003 0:37 390,351227
V0002SA ET9024 01.04.2003 0:43 387,720032
V0002SA ET9024 01.04.2003 0:44 390,294189
V0002SA ET9024 01.04.2003 0:50 387,451233
V0002SA ET9024 01.04.2003 0:51 390,277893
V0002SA ET9024 01.04.2003 0:56 387,54895
V0002SA ET9024 01.04.2003 0:57 390,294189
V0002SA ET9024 08.04.2003 4:08 399,808838

есть некий девайс, который записывает информацию в базу каждые 3 сек.
В поле 1 - номер девайса, в поле 3 - время записи в базу. Поле 4 - записанное значение. Все значения разбиваются на группы. Например - меньше 50, от 50-340 и больше 418. Вопрос как лучше всего выбрать следующие данные:

время начала отклонения (например > 418), время окончания отклонения (стало <418), максимальное отклоненеие (MAX(Field4)) и минимальное отклонение (MIN(Field4)).
Но вся фишка в том, что в базе инфа собрана за разные девайсы (Field1 не одинаковый) и каждый из них скидывает данные в базу 3 сек. И очень желательно обойтись одним курсором - текущим.
Мой вариант - добавить 2 колонки - DT_prev и DT_next - время для каждого девайса с "опережением" (т.е. на одну запись вперед) и время с "запазданием" (т.е. на одну запись назад). Потом сделать выборку (и вот тут косяк с группировкой данных):
SELECT MIN([DATETIME]) AS DT_start, MAX([DATETIME]) AS DT_finish, MIN([Value]) AS MIN_V, MAX([Value]) AS MAX_V, count([DATETIME])
FROM test_table
WHERE (DT_next-DATETIME)<=#12/30/1899 0:0:3# Or (DATETIME-DT_prev)<=#12/30/1899 0:0:3# And (Value>418)
GROUP BY ???????;
...
Рейтинг: 0 / 0
Хитрый SQL запрос
    #32648135
Johnny_lcool
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если в GROUP BY не указывать ничего, то выборка пойдет по всем записям где разница во времени 3 сек., а если указать DATETIME то не сгруппирет ничего - отберет нужные записи и все. КАК БЫТЬ?
А надо выбрать следующие:
вот 4:13 утра - пошло превышение (>418) и начать фиксировать данные в течение времени превышения, потом в 4:30 стало меньше 418 (перестали фиксировать) и т.д. по всей таблице...
...
Рейтинг: 0 / 0
Хитрый SQL запрос
    #32648142
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант. Добавь еще одно поле "изменение значения".

Т.е. в момент записи нового значения определить в таблице предыдущее (по времени) значение для того же девайса и кроме нового значения записать разницу нового и предыдущего значения. Ну, или само предыдущее значение.

Дальше объяснять или идея понятна?
...
Рейтинг: 0 / 0
Хитрый SQL запрос
    #32648150
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется, что проще будет через UNION каждого условия, а в конце сделать GROUP BY device number...
...
Рейтинг: 0 / 0
Хитрый SQL запрос
    #32648563
Johnny_lcool
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Товарищи, тут проблема в том, что для каждого девайса может быть несколько периодов по времени!! А вот как их выбрать? Забейте на девайсы - они задаются при выборке (интервал перегрузок тоже), главное, - время - как его разбить в группы, которые сможет обработать запрос?! GROUP BY видит разные значения и "говорит", что группировать нечего! Если же не задать GROUP BY то сгруппирует ВСЕ возможные интервалы в одну строку.
...
Рейтинг: 0 / 0
Хитрый SQL запрос
    #32648571
Johnny_lcool
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ, я к девайсам доступа не имею и перепрограммировать их никто пока не осбирается! Так исходить надо из того что есть.
...
Рейтинг: 0 / 0
Хитрый SQL запрос
    #32648616
Johnny_lcool
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Результат выглядит так:

Нач. откл. Мин.Знач. Макс. знач. Кон. откл.

01.01.04 2:23 418,5 421,7 01.01.04 3:44
01.01.04 4:57 419,3 427,8 01.01.04 6:48
01.01.04 7:06 418,4 419,0 01.01.04 7:10

и т.д.
...
Рейтинг: 0 / 0
Хитрый SQL запрос
    #32648672
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Johnny_lcoolя к девайсам доступа не имею и перепрограммировать их никто пока не осбирается! Так исходить надо из того что есть.
Johnny_lcoolМой вариант - добавить 2 колонки - DT_prev и DT_next...
Кто-то, кого-то путает. Если ты можешь добавить 2 колонки, то почему не можешь добавить одну?

Johnny_lcoolТоварищи, тут проблема в том, что для каждого девайса может быть несколько периодов по времени!! А вот как их выбрать?
"Стандартное" решение - это создание специальной служебной таблицы, которая будет иметь диапазоны значений. Примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE listPeriod (PeriodID I, nOrder I, ;
FromDate N( 18 , 2 ), ToDate N( 18 , 2 ), NickName C( 50 ))

PeriodId	nOrder	FromValue	 toValue	NickName
 1 		 1 	 0 		 50 		Первый период до  50 
 1 		 2 	 51 		 340 		Второй период от  51  до  340 
 1 		 3 	 341 		 418 		Третий период от  341  до  418 
 2 		 4 	 419 		 9999999 		Четвертый период от  419 

Ну, а далее просто объединяешь эту таблицу и твою с исходными данными

Код: plaintext
1.
2.
3.
4.
SELECT ...
FROM test_table
INNER JOIN listPeriod ON test_table.Value BETWEEN listPeriod.FromValue AND listPeriod.toValue
GROUP BY listPeriod.PeriodID
ORDER BY listPeriod.nOrder
...
Рейтинг: 0 / 0
Хитрый SQL запрос
    #32648704
Johnny_lcool
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМТ.е. в момент записи нового значения определить в таблице предыдущее (по времени) значение для того же девайса и кроме нового значения записать разницу нового и предыдущего значения.
Исходные значения-то пишу в Базу не я...

А за ответ - спасибо! Ща опробую.
...
Рейтинг: 0 / 0
Хитрый SQL запрос
    #32652092
Johnny_lcool
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мда, вот если бы такую таблицу можно было сделать для времени!
(Эта группирует значения...)
...
Рейтинг: 0 / 0
Хитрый SQL запрос
    #32652198
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Johnny_lcoolМда, вот если бы такую таблицу можно было сделать для времени!
(Эта группирует значения...)

В смысле только время без даты? Для этой цели проще использовать конвертацию в строку:

SET HOUR TO 24
?TTOC(DateTime(),2)

Соответсвенно, условие объединения будут

ON TTOC(test_table.FieldDate,2) BETWEEN ListPeriod.FromTime AND ListPeriod.ToTime

Правда, в этом случае принципиальное значение будет иметь текущая настройка SET HOUR. Т.е. за этим надо будет следить отдельно.

Если хочется не зависеть от этой настройки, то можно так:

?RIGHT(TTOC(DateTime(),1))

Это строка то же время, но без разделителей причем всегда в 24 часовом формате вне зависимости от настройки SET HOUR

Еще можно перевести время в секунды

?HOUR(DateTime())*3600+MINUTE(DateTime())*60+SEC(DateTime())

Т.е. в качестве границ диапазона хранить целое число - количество секунд с полуночи
...
Рейтинг: 0 / 0
Хитрый SQL запрос
    #32652357
Johnny_lcool
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, попутно, есть ли средство, позволяющее к данной таблице, добавить колонку этой же таблицы но со "смещением" записей вверх или вниз?
...
Рейтинг: 0 / 0
Хитрый SQL запрос
    #32652792
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Штатного" нет. Придется самому программить.
...
Рейтинг: 0 / 0
Хитрый SQL запрос
    #32655343
Johnny_lcool
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мда, а промежутки-то по времени - не фиксированные (произвольные). Это относится каа к началу и концу промежутка, так и к его длятельности...
Тяжко мне! Может за PL/SQL взяться?
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Хитрый SQL запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]