Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2010, 13:29   #1
euronymous
Пользователь
 
Регистрация: 26.10.2008
Сообщений: 14
По умолчанию Фильтрация повторяющихся записей

Добрый день!
Помогите, пожалуйста составить запрос, который будет осуществлять следующее (СУБД MS SQL Server):
есть таблица примерно такого вида (для упрощения задачи):
1) name - varchar(20) - название контролируемого объекта
2) state - integer - состояние двери объекта (0 - закрыта, 1 - открыта)
3) DT - datetime - время фиксирования состояния двери
В эту таблицу системой контроля постоянно прописывается состояние дверей контролируемых объектов. Причем прописывается как изменение состояния, так и через каждый час (или минуту или день) подтверждение текущего состояния. Например в таком виде:
name state DT
123 1 01.01.2010
123 1 02.01.2010
123 0 02.01.2010
234 1 02.01.2010
123 1 02.01.2010
234 1 03.01.2010
123 1 03.01.2010
Необходимо написать запрос, который возвращал бы только факты изменений состояний дверей по всем объектам за выбранный период времени. Т.е. нужно фильтровать последовательные подтверждения одного и того же состояния.
Очень прошу помочь разобраться. Сам кое что написал, но очень большой и запутанный запрос получился, который еще и чертовски долго работает.
euronymous вне форума Ответить с цитированием
Старый 04.02.2010, 14:14   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
select name, dt, state st0
,--получение одного след по времени состояния
 ( select top 1 state from t t1
   where t1.namt0.name and t1.dt>t0.dt order by dt) st1
from t t0 order by dt
where st0<>st1
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 04.02.2010, 14:42   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

не проверял, но выглядит красиво и правильно!
evg_m, +1

p.s. только во внутреннем запросе потерялся знак равно
(where t1.name = t0.name and ....)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.02.2010, 15:17   #4
euronymous
Пользователь
 
Регистрация: 26.10.2008
Сообщений: 14
По умолчанию

Проверил, не знаю как в оригинале, но после трансляции до Trans-SQL не работает. В смысле работает, но не фильтрует (или не все фильтрует). Вполне возможно, что я где-то напортачил. Но вроде бы логика совпадает.
Код:
 select name, dt, state
from t t0 
where state <> (select top 1 state from t t1
   where t1.name = t0.name and t1.dt > t0.dt order by dt)
order by dt
euronymous вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
фильтрация повторяющихся ячеек в DBGrid Evgenii БД в Delphi 1 02.08.2009 20:40
Фильтрация записей в таблице TaTT DoGG БД в Delphi 49 28.03.2009 19:04
Удаление повторяющихся записей gavrylyuk Microsoft Office Excel 3 28.06.2008 08:10
Фильтрация записей с помощью Grid'а. Repz БД в Delphi 1 02.05.2008 04:55
Поиск повторяющихся значений Flangini Microsoft Office Excel 23 22.02.2008 15:57