powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / два вопроса
15 сообщений из 15, страница 1 из 1
два вопроса
    #34373795
andy777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
заранее извиняюсь если глупые. sql плотно занимаюсь не так давно - многие вещи с трудом доходят :)
1. имеем вот такой запрос
flow=# SELECT sourcepeeraddress,sum(tooctets),sum(fromoctets) FROM flowd where sourcepeeraddress='192.168.128.82' GROUP BY sourcepeeraddress UNION SELECT destpeeraddress,sum(fromoctets),sum(tooctets) FROM flowd where destpeeraddress='192.168.128.82' GROUP BY destpeeraddress;
sourcepeeraddress | sum | sum
-------------------------+-------------+------------
192.168.128.82 | 85202697 | 520100644
192.168.128.82 |136988611| 1417816732
(записей: 2)

flow=#
необходимо просуммировать строки по столбцам sum. как?
2. хочу построить пару view на основе примерно такого селекта но с выборкой по времени с начала месяца, за предыдущий месяц. время в базе у меня лежит в виде integer (количество секунд). не могу вьехать как вычислить начало месяца.
SELECT sourcepeeraddress,sum(tooctets),sum(fromoctets) FROM flowd where sourcepeeraddress=(select ip from ipaddr where id>1 and id<26 and ip=sourcepeeraddress) GROUP BY sourcepeeraddress;
...
Рейтинг: 0 / 0
два вопроса
    #34373962
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ответ на первый вопрос: делай все вообще в один запрос.
ЗАчем два раза в таблицу лазить?
Используй CASE.
...
Рейтинг: 0 / 0
два вопроса
    #34374121
andy777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
это я и пытаюсь сделать - но! тупое написание
flow=# SELECT sum(tooctets),sum(fromoctets) FROM flowd where sourcepeeraddress='192.168.128.82' or destpeeraddress='192.168.128.82';
sum | sum
------------+-----------
1503132665 | 657148441
(1 запись)

flow=#
отличается от желаемого результата
flow=# SELECT sourcepeeraddress,sum(tooctets),sum(fromoctets) FROM flowd where sourcepeeraddress='192.168.128.82' GROUP BY sourcepeeraddress UNION SELECT destpeeraddress,sum(fromoctets),sum(tooctets) FROM flowd where destpeeraddress='192.168.128.82' GROUP BY destpeeraddress;
sourcepeeraddress | sum | sum
-------------------+-----------+------------
192.168.128.82 | 85206131 | 520129943
192.168.128.82 | 137018498 | 1417926534
(записей: 2)

flow=#

85206131+137018498 не равно 1503132665 как получилось в самом первом селекте. сложить надо sum(tooctets) + sum(fromoctets). вот тут то я и туплю :)
...
Рейтинг: 0 / 0
два вопроса
    #34374176
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy777 вот тут то я и туплю :)Ты просто забыл про CASE :)
...
Рейтинг: 0 / 0
два вопроса
    #34374237
andy777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не забыл. разбираюсь.
...
Рейтинг: 0 / 0
два вопроса
    #34379934
andy777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну в общем, все вроде получилось и даже обошлись без CASE
flow=# CREATE VIEW test_sum AS SELECT ip, (select sum(tooctets) from flowd where sourcepeeraddress=a.ip or destpeeraddress=a.ip) AS in, (select sum(fromoctets) from flowd where sourcepeeraddress=a.ip or destpeeraddress=a.ip) AS out from ipaddr a where id>2 and id<32556;
все работает, вычисляется верно. хотелось бы вьюшку ограничить обсчетом начиная с начала месяца по текущую дату - но никак не могу вьехать как это сделать... хоть направление подскажите...
...
Рейтинг: 0 / 0
два вопроса
    #34379942
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
таки придется тебе с CASE разбираться.
Ты же в табличку теперь три раза лазаишь, а можно всё за один проход по ней сделать...
...
Рейтинг: 0 / 0
два вопроса
    #34379949
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бабичев Сергейтаки придется тебе с CASE разбираться.
Ты же в табличку теперь три раза лазаишь, а можно всё за один проход по ней сделать...А, пардон...
В таблицу с трафиком ты два раза ходишь и ещё один раз в таблицу со списком IP-адресов.
Таки можно все за один проход по таблице с трафиком реализовать.
...
Рейтинг: 0 / 0
два вопроса
    #34379961
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy7772. хочу построить пару view на основе примерно такого селекта но с выборкой по времени с начала месяца, за предыдущий месяц. время в базе у меня лежит в виде integer (количество секунд). не могу вьехать как вычислить начало месяца.
SELECT sourcepeeraddress,sum(tooctets),sum(fromoctets) FROM flowd where sourcepeeraddress=(select ip from ipaddr where id>1 and id<26 and ip=sourcepeeraddress) GROUP BY sourcepeeraddress;Видимо есть какая-то точка отсчета, относительно которой ведется отсчет времени в секундах? Что-то типа UNIXTIME.
Если есть такая точка отсчета, то сложности никакой нет - к точке отсчета прибавляешь свое время в секундах, получаешь нормальное значение для даты.
Получить же начала месяца из даты можно как минимум двумя функциями по работе с датами.
...
Рейтинг: 0 / 0
два вопроса
    #34380391
andy777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Бабичев Сергей Бабичев Сергейтаки придется тебе с CASE разбираться.
Ты же в табличку теперь три раза лазаишь, а можно всё за один проход по ней сделать...А, пардон...
В таблицу с трафиком ты два раза ходишь и ещё один раз в таблицу со списком IP-адресов.
Таки можно все за один проход по таблице с трафиком реализовать.
можно, почему же нет. только откуда я узнаю адреса клиентов как не из таблицы с их адресами? :) остальные мне нафиг не нужны. вот сократить до одного захода в таблицу с трафиком - это было бы хорошо. но пока меня и так устраивает.
...
Рейтинг: 0 / 0
два вопроса
    #34380438
andy777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Бабичев Сергей andy7772. хочу построить пару view на основе примерно такого селекта но с выборкой по времени с начала месяца, за предыдущий месяц. время в базе у меня лежит в виде integer (количество секунд). не могу вьехать как вычислить начало месяца.
SELECT sourcepeeraddress,sum(tooctets),sum(fromoctets) FROM flowd where sourcepeeraddress=(select ip from ipaddr where id>1 and id<26 and ip=sourcepeeraddress) GROUP BY sourcepeeraddress;Видимо есть какая-то точка отсчета, относительно которой ведется отсчет времени в секундах? Что-то типа UNIXTIME.
Если есть такая точка отсчета, то сложности никакой нет - к точке отсчета прибавляешь свое время в секундах, получаешь нормальное значение для даты.
Получить же начала месяца из даты можно как минимум двумя функциями по работе с датами.
да, именно unixtime. вот еще бы найти эти функции :) а то читаю документацию и пока никак добраться до них не могу...
...
Рейтинг: 0 / 0
два вопроса
    #34380499
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гдето так
extract (epoch from date_trunc('month', to_timestamp(unixtime_value)))
вернеться unixtime_value на начало месяца
...
Рейтинг: 0 / 0
два вопроса
    #34383215
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy777вот сократить до одного захода в таблицу с трафиком - это было бы хорошо.Дык, используй же CASE в конце-то концов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select a.ip,
       sum(case
             when f.sourcepeeraddress=a.ip or f.destpeeraddress=a.ip 
                then tooctets
             else  0 
           end) in,
       sum(case
             when f.sourcepeeraddress=a.ip or f.destpeeraddress=a.ip 
                then fromoctets
             else  0 
           end) out
  from ipaddr a
  left join
       flowd f
    on f.sourcepeeraddress=a.ip or f.destpeeraddress=a.ip
 where a.id >  2  and a.id <  32556 
 group by a.ip;
...
Рейтинг: 0 / 0
два вопроса
    #34383238
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бабичев Сергей andy777вот сократить до одного захода в таблицу с трафиком - это было бы хорошо.Дык, используй же CASE в конце-то концов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select a.ip,
       sum(case
             when f.sourcepeeraddress=a.ip or f.destpeeraddress=a.ip 
                then tooctets
             else  0 
           end) in,
       sum(case
             when f.sourcepeeraddress=a.ip or f.destpeeraddress=a.ip 
                then fromoctets
             else  0 
           end) out
  from ipaddr a
  left join
       flowd f
    on f.sourcepeeraddress=a.ip or f.destpeeraddress=a.ip
 where a.id >  2  and a.id <  32556 
 group by a.ip;
Кстати, в таком разрезе и CASE нафиг не нужен.
Вот так попробуй:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select a.ip,
       sum(tooctets) in,
       sum(fromoctets) out
  from ipaddr a
  left join
       flowd f
    on f.sourcepeeraddress=a.ip or f.destpeeraddress=a.ip
 where a.id >  2  and a.id <  32556 
 group by a.ip;
...
Рейтинг: 0 / 0
два вопроса
    #34383453
andy777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
большое спасибо за помощь и терпение - пошел разбираться :)
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / два вопроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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