Конференция "Базы" » SQL запрос [D7, IB6.x]
 
  • Tonich (16.07.09 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 (16.07.09 18:45) [1]
    Делайте ХП, или на клиенте. Был бы firebird 2 можно было б помучатся с select'ом.
  • СовестьДМ © (16.07.09 19:51) [2]
    пересмотреть своё вИденье структуры таблицы
    а впредь читать наизусть принципы построения реляционных БД
  • Tonich (16.07.09 20:28) [3]
    makz   (16.07.09 18:45) [1]

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

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

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

    задача такая , есть ряд устройств которые читаются на клиенте, раз в минуту необходимо сохранять показания с устройств в базе... после чего необходимо делать то что я описал в 1 посте...
  • Loginov Dmitry © (16.07.09 22:44) [4]
    жесть. Имхо, здесь либо всю обработку на клиена повесить, либо переработать структуру базы данных. Например ввести дополнительное поле "номер кластера", добавлять сначала записи, но номер кластера не указывать, а затем, как только встретится SWITCHCOUNT=0, устанавливать всем записям без номера кластера очередной номер кластера.
    Тогда запрос очень простой получиться: GROUP BY по номеру кластера с суммированием времени, поиск записи по заданному интервалу времени (можно с помощью HAVING), и у найденной записи берем номер кластера и делаем выборку только по этому номеру.
  • tonich (16.07.09 23:03) [5]
    Loginov Dmitry ©   (16.07.09 22:44) [4]

    Спасибо за идею... )
  • Кщд (17.07.09 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

  • Кщд (17.07.09 13:06) [7]
    это вопрос)
  • Кщд (17.07.09 13:29) [8]

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

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


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

    номер кластера надо присваивать сразу, иначе открытый(для которого нет терминирующий записи со switchcount=0) интервал не получим(придется дописывать SQL специальным условием для открытого интервала, что не очень-то красиво)
  • tonich (17.07.09 14:16) [9]

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


    ну у меня  повис это запрос...
  • Кщд (17.07.09 14:23) [10]
    >tonich   (17.07.09 14:16) [9]
    значит, парсер прожевал
    дело за малым - расставить индексы
  • tonich (17.07.09 17:04) [11]
    Спасибо всем....... )
 
Конференция "Базы" » SQL запрос [D7, IB6.x]
Есть новые Нет новых   [134473   +33][b:0][p:0.002]