Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.11.21;
Скачать: CL | DM;

Вниз

SQL запрос   Найти похожие ветки 

 
Tonich   (2009-07-16 15:25) [0]

День добрый есть такой вопрос по 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

Спасибо


 
makz   (2009-07-16 18:45) [1]

Делайте ХП, или на клиенте. Был бы firebird 2 можно было б помучатся с select"ом.


 
СовестьДМ ©   (2009-07-16 19:51) [2]

пересмотреть своё вИденье структуры таблицы
а впредь читать наизусть принципы построения реляционных БД


 
Tonich   (2009-07-16 20:28) [3]

makz   (16.07.09 18:45) [1]

да пришлось так и сделать (

СовестьДМ ©   (16.07.09 19:51) [2]

ну тогда примера ради, подскажите вид таблицы в данном случаи...

задача такая , есть ряд устройств которые читаются на клиенте, раз в минуту необходимо сохранять показания с устройств в базе... после чего необходимо делать то что я описал в 1 посте...


 
Loginov Dmitry ©   (2009-07-16 22:44) [4]

жесть. Имхо, здесь либо всю обработку на клиена повесить, либо переработать структуру базы данных. Например ввести дополнительное поле "номер кластера", добавлять сначала записи, но номер кластера не указывать, а затем, как только встретится SWITCHCOUNT=0, устанавливать всем записям без номера кластера очередной номер кластера.
Тогда запрос очень простой получиться: GROUP BY по номеру кластера с суммированием времени, поиск записи по заданному интервалу времени (можно с помощью HAVING), и у найденной записи берем номер кластера и делаем выборку только по этому номеру.


 
tonich   (2009-07-16 23:03) [5]

Loginov Dmitry ©   (16.07.09 22:44) [4]

Спасибо за идею... )


 
Кщд   (2009-07-17 13:06) [6]

>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


 
Кщд   (2009-07-17 13:06) [7]

это вопрос)


 
Кщд   (2009-07-17 13:29) [8]


> Loginov Dmitry ©   (16.07.09 22:44) [4]
>
> Имхо, здесь либо всю обработку на клиена повесить

в IB есть хранимые процедуры - к чему здесь клиент?


>  либо переработать структуру базы данных. Например ввести
> дополнительное поле "номер кластера", добавлять сначала
> записи, но номер кластера не указывать, а затем, как только
> встретится SWITCHCOUNT=0, устанавливать всем записям без
> номера кластера очередной номер кластера.

номер кластера надо присваивать сразу, иначе открытый(для которого нет терминирующий записи со switchcount=0) интервал не получим(придется дописывать SQL специальным условием для открытого интервала, что не очень-то красиво)


 
tonich   (2009-07-17 14:16) [9]


> Кщд   (17.07.09 13:06) [7]


ну у меня  повис это запрос...


 
Кщд   (2009-07-17 14:23) [10]

>tonich   (17.07.09 14:16) [9]
значит, парсер прожевал
дело за малым - расставить индексы


 
tonich   (2009-07-17 17:04) [11]

Спасибо всем....... )



Страницы: 1 вся ветка

Текущий архив: 2010.11.21;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.006 c
2-1283276087
barsik
2010-08-31 21:34
2010.11.21
Как сделать загрузку формы динамично


15-1281510965
AlexDn
2010-08-11 11:16
2010.11.21
Движок Вконтакте


2-1283367516
Andrey K
2010-09-01 22:58
2010.11.21
В TListBox с помощью мыши поменять Items


15-1282002935
Дмитрий С
2010-08-17 03:55
2010.11.21
Синхронизация доступа к хешу.


15-1281383797
М. Береговой
2010-08-09 23:56
2010.11.21
Будет землетряс или не будет? :-)