Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Не могу выбрать нормальный алгоритм хранимой / 3 сообщений из 3, страница 1 из 1
07.12.2005, 15:15
    #33422603
newbee
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу выбрать нормальный алгоритм хранимой
Здравствуйте.

Имеем таблицу
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE detail
(
   date_det date NOT NULL,
   src_ip inet NOT NULL,
   dst_ip inet NOT NULL,
   bts int4 DEFAULT  0 ,
   src_int int2,
   dst_int int2
) WITH OIDS;

Со значениями, к примеру

date_det src_ip dst_ip bts
2005-12-07 192.168.8.1 219.243.4.23 5000
2005-12-07 192.168.4.1 219.243.4.23 5000
2005-12-07 219.243.4.23 192.168.8.1 5000

Задача: для каждого локального ip (который может быть как в src_ip, так и в dst_ip) просуммировать bts для всех повторяющихся интернетовских ip по направлениям in и out (т.е. если src_ip <<='192.168.0.0/16', то bts будет направление out) за определенную дату. Т.е. на выходе нужно получить таблицу вида:

date src dst in out
2005-12-07 192.168.8.1 219.243.4.23 5000 5000
2005-12-07 192.168.4.1 219.243.4.23 5000

Поразмыслив, я не придумал ничего кроме следующего:

1) Вытащить список локальных ip
2) Вытащить список инетовых ip
3) Цикл перебора списка локальных ип, вложенный цикл перебора инетовых ип, в котором уже в свою очередь идет выборка всех таких же локальных и инетовых ип, расставляется направление и считается сумма.

Это все в принципе можно сделать функцией. Вопрос надо ли это делать функцией и можно ли как-то это сделать лучше?

До этого я пытался проводить заполнение второй таблицы на ходу с помощью триггера , но сейчас ясно, что это неправильно.
...
Рейтинг: 0 / 0
07.12.2005, 15:39
    #33422715
-me-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу выбрать нормальный алгоритм хранимой
По-моему, вполне можно решить след. запросами:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create view in_out as
  select date_det, src_ip as ip, bts as bytes_out,  0  as bytes_in
  from details
  where src_ip <<= '192.168.0.0/16'
  union
  select date_det, dst_ip as ip,  0  as bytes_out, bts as bytes_in
  from details
  where dst_ip <<= '192.168.0.0/16' ;

select date_det, ip, sum(bytes_out) as total_out, sum(bytes_in) as total_in
from in_out
group by date_det, ip;
...
Рейтинг: 0 / 0
07.12.2005, 15:59
    #33422812
-me-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу выбрать нормальный алгоритм хранимой
Или даже одним запросом :)
Код: plaintext
1.
2.
3.
4.
5.
6.
 select date_det,
     (case when src_ip <<= '192.168.0.0/16' then src_ip else dst_ip end) as ip,
  sum(case when src_ip <<= '192.168.0.0/16' then bts else  0  end)         as bytes_out,
  sum(case when src_ip <<= '192.168.0.0/16' then  0  else bts end)         as bytes_in
  from details
  group by date_det, ip;
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Не могу выбрать нормальный алгоритм хранимой / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]