Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
13.08.2004, 10:33
|
|||
|---|---|---|---|
|
|||
Хитрый SQL запрос |
|||
|
#18+
есть таблица 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 ???????; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.08.2004, 10:38
|
|||
|---|---|---|---|
|
|||
Хитрый SQL запрос |
|||
|
#18+
если в GROUP BY не указывать ничего, то выборка пойдет по всем записям где разница во времени 3 сек., а если указать DATETIME то не сгруппирет ничего - отберет нужные записи и все. КАК БЫТЬ? А надо выбрать следующие: вот 4:13 утра - пошло превышение (>418) и начать фиксировать данные в течение времени превышения, потом в 4:30 стало меньше 418 (перестали фиксировать) и т.д. по всей таблице... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.08.2004, 10:42
|
|||
|---|---|---|---|
Хитрый SQL запрос |
|||
|
#18+
Как вариант. Добавь еще одно поле "изменение значения". Т.е. в момент записи нового значения определить в таблице предыдущее (по времени) значение для того же девайса и кроме нового значения записать разницу нового и предыдущего значения. Ну, или само предыдущее значение. Дальше объяснять или идея понятна? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.08.2004, 10:44
|
|||
|---|---|---|---|
Хитрый SQL запрос |
|||
|
#18+
Мне кажется, что проще будет через UNION каждого условия, а в конце сделать GROUP BY device number... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.08.2004, 12:56
|
|||
|---|---|---|---|
|
|||
Хитрый SQL запрос |
|||
|
#18+
Товарищи, тут проблема в том, что для каждого девайса может быть несколько периодов по времени!! А вот как их выбрать? Забейте на девайсы - они задаются при выборке (интервал перегрузок тоже), главное, - время - как его разбить в группы, которые сможет обработать запрос?! GROUP BY видит разные значения и "говорит", что группировать нечего! Если же не задать GROUP BY то сгруппирует ВСЕ возможные интервалы в одну строку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.08.2004, 12:57
|
|||
|---|---|---|---|
|
|||
Хитрый SQL запрос |
|||
|
#18+
ВладимирМ, я к девайсам доступа не имею и перепрограммировать их никто пока не осбирается! Так исходить надо из того что есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.08.2004, 13:08
|
|||
|---|---|---|---|
|
|||
Хитрый SQL запрос |
|||
|
#18+
Результат выглядит так: Нач. откл. Мин.Знач. Макс. знач. Кон. откл. 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 и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.08.2004, 13:27
|
|||
|---|---|---|---|
Хитрый SQL запрос |
|||
|
#18+
Johnny_lcoolя к девайсам доступа не имею и перепрограммировать их никто пока не осбирается! Так исходить надо из того что есть. Johnny_lcoolМой вариант - добавить 2 колонки - DT_prev и DT_next... Кто-то, кого-то путает. Если ты можешь добавить 2 колонки, то почему не можешь добавить одну? Johnny_lcoolТоварищи, тут проблема в том, что для каждого девайса может быть несколько периодов по времени!! А вот как их выбрать? "Стандартное" решение - это создание специальной служебной таблицы, которая будет иметь диапазоны значений. Примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Ну, а далее просто объединяешь эту таблицу и твою с исходными данными Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.08.2004, 13:40
|
|||
|---|---|---|---|
|
|||
Хитрый SQL запрос |
|||
|
#18+
ВладимирМТ.е. в момент записи нового значения определить в таблице предыдущее (по времени) значение для того же девайса и кроме нового значения записать разницу нового и предыдущего значения. Исходные значения-то пишу в Базу не я... А за ответ - спасибо! Ща опробую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.08.2004, 09:40
|
|||
|---|---|---|---|
|
|||
Хитрый SQL запрос |
|||
|
#18+
Мда, вот если бы такую таблицу можно было сделать для времени! (Эта группирует значения...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.08.2004, 10:31
|
|||
|---|---|---|---|
Хитрый SQL запрос |
|||
|
#18+
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()) Т.е. в качестве границ диапазона хранить целое число - количество секунд с полуночи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.08.2004, 11:34
|
|||
|---|---|---|---|
|
|||
Хитрый SQL запрос |
|||
|
#18+
Кстати, попутно, есть ли средство, позволяющее к данной таблице, добавить колонку этой же таблицы но со "смещением" записей вверх или вниз? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.08.2004, 13:49
|
|||
|---|---|---|---|
Хитрый SQL запрос |
|||
|
#18+
"Штатного" нет. Придется самому программить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=41&tablet=1&tid=1595975]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 263ms |
| total: | 410ms |

| 0 / 0 |
