-
День добрый есть такой вопрос по SQL.
Предположим, есть таблица со следующими полями
ID TIME IDDEVICE SWITCHCOUNT ERRORCOUNT
И допустим, она заполнена следующими значениями
1 | 201 | 01.02.09 00:00 | 5 | 0 2 | 201 | 01.02.09 00:01 | 1 | 0 3 | 201 | 01.02.09 00:02 | 0 | 0 4 | 201 | 01.02.09 00:03 | 3 | 0 5 | 201 | 01.02.09 00:04 | 4 | 0 6 | 201 | 01.02.09 00:05 | 5 | 0 7 | 201 | 01.02.09 00:06 | 2 | 0
Те записи у которых SWITCHCOUNT > 0 объеденяются в кластеры. То есть для этого набора данных будет всего 2 кластера
1 | 201 | 01.02.09 00:00 | 5 | 0 2 | 201 | 01.02.09 00:01 | 1 | 0
и
4 | 201 | 01.02.09 00:03 | 3 | 0 5 | 201 | 01.02.09 00:04 | 4 | 0 6 | 201 | 01.02.09 00:05 | 5 | 0 7 | 201 | 01.02.09 00:06 | 2 | 0
Положим что у каждлого такого кластера есть сумарное вермя(Т), то есть для первого кластера это 01.02.09 00:00 - 01.02.09 00:01 (1 минута), для второго кластера это 01.02.09 00:03 - 01.02.09 00:06 (3 минуты)
так вот собственно вопрос, как исключить в конечном результате те кластеры сумарное время которых меньше заданного интервала.
Например для данного набора если задать время T<2 мин. то на выходе получим
4 | 201 | 01.02.09 00:03 | 3 | 0 5 | 201 | 01.02.09 00:04 | 4 | 0 6 | 201 | 01.02.09 00:05 | 5 | 0 7 | 201 | 01.02.09 00:06 | 2 | 0
Спасибо
-
Делайте ХП, или на клиенте. Был бы firebird 2 можно было б помучатся с select'ом.
-
пересмотреть своё вИденье структуры таблицы а впредь читать наизусть принципы построения реляционных БД
-
makz (16.07.09 18:45) [1]
да пришлось так и сделать (
СовестьДМ © (16.07.09 19:51) [2]
ну тогда примера ради, подскажите вид таблицы в данном случаи...
задача такая , есть ряд устройств которые читаются на клиенте, раз в минуту необходимо сохранять показания с устройств в базе... после чего необходимо делать то что я описал в 1 посте...
-
жесть. Имхо, здесь либо всю обработку на клиена повесить, либо переработать структуру базы данных. Например ввести дополнительное поле "номер кластера", добавлять сначала записи, но номер кластера не указывать, а затем, как только встретится SWITCHCOUNT=0, устанавливать всем записям без номера кластера очередной номер кластера. Тогда запрос очень простой получиться: GROUP BY по номеру кластера с суммированием времени, поиск записи по заданному интервалу времени (можно с помощью HAVING), и у найденной записи берем номер кластера и делаем выборку только по этому номеру.
-
Loginov Dmitry © (16.07.09 22:44) [4]
Спасибо за идею... )
-
>Tonich (16.07.09 15:25) просто интересно, сработает такое:
select d.*,
(select min(p.dt)
from devicestate p
where p.id <= d.id
and (p.id = (select max(p2.id) + 1
from devicestate p2
where p2.id <= p.id
and p2.switchcount = 0
)
or not exists (select null
from devicestate p2
where p2.id <= d.id
and p2.switchcount = 0
)
)
),
(select max(p.dt)
from devicestate p
where p.id >= d.id
and (p.id = (select min(p2.id) - 1
from devicestate p2
where p2.id > p.id
and p2.switchcount = 0
)
or not exists (select null
from devicestate p2
where p2.id > d.id
and p2.switchcount = 0
)
)
)
from devicestate d
where d.switchcount != 0
-
это вопрос)
-
> Loginov Dmitry © (16.07.09 22:44) [4] > > Имхо, здесь либо всю обработку на клиена повесить
в IB есть хранимые процедуры - к чему здесь клиент?
> либо переработать структуру базы данных. Например ввести > дополнительное поле "номер кластера", добавлять сначала > записи, но номер кластера не указывать, а затем, как только > встретится SWITCHCOUNT=0, устанавливать всем записям без > номера кластера очередной номер кластера.
номер кластера надо присваивать сразу, иначе открытый(для которого нет терминирующий записи со switchcount=0) интервал не получим(придется дописывать SQL специальным условием для открытого интервала, что не очень-то красиво)
-
> Кщд (17.07.09 13:06) [7]
ну у меня повис это запрос...
-
>tonich (17.07.09 14:16) [9] значит, парсер прожевал дело за малым - расставить индексы
-
Спасибо всем....... )
|