Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2015, 11:37   #1
Varabei
Пользователь
 
Регистрация: 28.10.2008
Сообщений: 15
По умолчанию Склейка таблиц

Привет!
Есть 2 таблицы (на postgresql)

table1:
`datetime` - timestamp without time zone,
`t1` - smalint,
`t2` - smalint

table2:
`datetime` - timestamp without time zone,
`h1` - smalint,
`h2` - smalint


В отчете нужно выводить средние данные за каждый час
Отдельно для каждой таблицы делаю выборку
Код:
SELECT max(datetime) as date,
             avg(t1) as t1, 
             avg(t2) as t2
            FROM db_asutp_2ceh.table1
            WHERE datetime >='2015-01-19 00:00' AND datetime <= '2015-01-20 00:00'
            GROUP BY round(extract(epoch from datetime)/3600)
            ORDER BY date
Но необходимо все это вывести в одной таблице, пример:

date | t1 | t2 | h1 | h2 |
..............
19.01.2015 00:29:00 | 23 | 45| 23 | 234|
19.01.2015 01:29:00 | 34 | 54| 435| 54 |
..............

Собственно и вопрос, как это можно сделать?
Varabei вне форума Ответить с цитированием
Старый 21.01.2015, 14:23   #2
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

Ну так добавьте недостающие поля.
lomastr_ вне форума Ответить с цитированием
Старый 21.01.2015, 14:59   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Наверное так:
Код:
SELECT max(datetime) as date,
             avg(t1) as t1, 
             avg(t2) as t2,
             avg(h1) as h1, 
             avg(h2) as h2,
            FROM db_asutp_2ceh.table1 ta1,db_asutp_2ceh.table2 ta2
            WHERE 
                      ta1.datetime >='2015-01-19 00:00' 
               AND ta1.datetime <= '2015-01-20 00:00'
               AND ta2.datetime >='2015-01-19 00:00' 
               AND ta2.datetime <= '2015-01-20 00:00'
            GROUP BY round(extract(epoch from ta1.datetime)/3600),round(extract(epoch from ta2.datetime)/3600)
            ORDER BY date
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.01.2015, 09:12   #4
Varabei
Пользователь
 
Регистрация: 28.10.2008
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Наверное так:
Код:
SELECT max(datetime) as date,
             avg(t1) as t1, 
             avg(t2) as t2,
             avg(h1) as h1, 
             avg(h2) as h2,
            FROM db_asutp_2ceh.table1 ta1,db_asutp_2ceh.table2 ta2
            WHERE 
                      ta1.datetime >='2015-01-19 00:00' 
               AND ta1.datetime <= '2015-01-20 00:00'
               AND ta2.datetime >='2015-01-19 00:00' 
               AND ta2.datetime <= '2015-01-20 00:00'
            GROUP BY round(extract(epoch from ta1.datetime)/3600),round(extract(epoch from ta2.datetime)/3600)
            ORDER BY date
Не получается, вместо 24 строк выводит 600 с чем то...
table1 - каждые 25 строк одинаковые. В table2 все разные.
Запрос выполняется несколько минут
Varabei вне форума Ответить с цитированием
Старый 26.01.2015, 10:15   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
select t1.t, t1.av1, t1.av2, t2.t, t2.av1, t2.av2
from ---группировать и счиать среднее по каждой таблице "отдельно"
       ( select hour(ta1.datetime) as t, avg(t1) as av1, avg(t2) as av2 from ta1
          where ...
          group by hour(ta1.datetime)
       ) as t1,
       ( select hour(ta2.datetime), .... from ta2
         where ....
         group ....
       ) as t2
where --- и потом СОБИРАТЬ по одинаковым часам 
          t1.t =t2.t

Код:
SELECT max(datetime) as date,
             avg(t1) as t1, 
             avg(t2) as t2,
             avg(h1) as h1, 
             avg(h2) as h2,
            FROM db_asutp_2ceh.table1 ta1,db_asutp_2ceh.table2 ta2
            WHERE 
ta1.datetime =ta2.datetime AND
                      ta1.datetime >='2015-01-19 00:00' 
               AND ta1.datetime <= '2015-01-20 00:00'
               AND ta2.datetime >='2015-01-19 00:00' 
               AND ta2.datetime <= '2015-01-20 00:00'
            GROUP BY round(extract(epoch from ta1.datetime)/3600),round(extract(epoch from ta2.datetime)/3600)
            ORDER BY date
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 26.01.2015 в 10:22.
evg_m вне форума Ответить с цитированием
Старый 26.01.2015, 13:01   #6
Varabei
Пользователь
 
Регистрация: 28.10.2008
Сообщений: 15
Радость

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
select t1.t, t1.av1, t1.av2, t2.t, t2.av1, t2.av2
from ---группировать и счиать среднее по каждой таблице "отдельно"
       ( select hour(ta1.datetime) as t, avg(t1) as av1, avg(t2) as av2 from ta1
          where ...
          group by hour(ta1.datetime)
       ) as t1,
       ( select hour(ta2.datetime), .... from ta2
         where ....
         group ....
       ) as t2
where --- и потом СОБИРАТЬ по одинаковым часам 
          t1.t =t2.t
Благодарю! то что нужно.
Правда на практике потребовались получасовые данные, за период в несколько суток.
В итоге получилось примерно так:
Код:
select t1.date, t1.t_svod_1, t2.niz_l_1 
from ---группировать и счиать среднее по каждой таблице "отдельно"
       ( select 
          
           round(extract(epoch from max(datetime))/1800) as h1,
            max(datetime) as date, 
          avg(t_svod_1) as t_svod_1 
          from db_asutp_2ceh.report ta1
           where datetime >='2015-01-19 00:00' AND datetime <= '2015-01-19 23:59'
          group by round(extract(epoch from datetime)/1800)
       ) as t1,
       ( select 
            round(extract(epoch from max(datetime))/1800) as h2, 
            max(datetime) as date, 
            avg(niz_l_1) as niz_l_1  
            from db_asutp_2ceh.regenerator ta2
           where datetime >='2015-01-19 00:00' AND datetime <= '2015-01-19 23:59'
          group by round(extract(epoch from datetime)/1800)
       ) as t2
where  
         t1.h1 = t2.h2

ORDER BY t1.date
Вроде работает
Varabei вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Склейка страниц .htaccess Дима я PHP 0 24.05.2014 13:25
Склейка двух base64 строк doktor255 Общие вопросы Delphi 22 06.05.2014 16:08
.htaccess склейка адресов hon PHP 0 03.04.2013 22:46
Склейка шестнадцатиричных чисел, чтение с COM порта vpn Общие вопросы C/C++ 2 05.02.2013 10:05
Склейка двух проэктов Pirotexnik C# (си шарп) 7 29.09.2012 00:47