Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2010.11.21;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.003 c
2-1282903113
sergio
2010-08-27 13:58
2010.11.21
SaveDialog


15-1281587871
IGray
2010-08-12 08:37
2010.11.21
Ищу исходники функции IntToStr на паскале


15-1281378423
crab
2010-08-09 22:27
2010.11.21
Требуется c++ -> delphi конвертор


15-1281428898
stas
2010-08-10 12:28
2010.11.21
TWebBrowser заполнить поле типа file


15-1281276816
Кто б сомневался
2010-08-08 18:13
2010.11.21
Литр пива в России





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский