сжатие результатов нескольких таблиц в уникальные строки на основе идентификатора - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь объединить результаты нескольких таблиц в одну.Идея состоит в том, чтобы отображать данные для многострочного графика в пользовательском интерфейсе.Результатом будет что-то вроде [дата / время] |давление |поток |потребление Каждый из 3 столбцов (давление, расход, потребление) взят из разных таблиц, но у них будет одинаковое поле даты и времени - поскольку мы хотим отобразить эти точки за это время.

Я подумал, что возможнообъединение всех могло бы помочь объединить результаты, но это, похоже, мало что дает.Я вижу в Интернете, чтобы использовать сводку?но я не уверен, что это сработает в этом случае.

Например, я делаю следующее.Один из вариантов - включить все ожидаемые строки результатов (все 3 типа) в каждое предложение, чтобы мы могли как-то «сквошить» их вместе на основе «datelabel» и оставить ноль, если он не существует в течение этого часа.

            select deviceid, min(flowrate),
            to_char(recorded, 'Mon-dd hh:00 pm') as datelabel
            from analytic.pressureflow p
             WHERE (deviceid = 162300) and flowtype = 'MIN'
             AND recorded >= '9/16/2019 11:24:00 AM' 
             AND recorded < '9/24/2019 11:24:00 AM' 
             group by deviceid, datelabel
            ), --select * from min_flow


            max_flow as (
             select deviceid, MAX(flowrate),
             to_char(recorded, 'Mon-dd hh:00 pm') as datelabel
            from analytic.pressureflow p
             WHERE (deviceid = 162300) and flowtype = 'MAX'
             AND recorded >= '9/16/2019 11:24:00 AM' 
             AND recorded < '9/24/2019 11:24:00 AM' 
             group by deviceid, datelabel
            ), -- select * from max_flow


            flow_temp as (
            select deviceid, avg(flowtemp) as flowtemp,
            null as tempvalue,
            to_char(recorded, 'Mon-dd hh:00 pm') as datelabel
             from twflowtemperature
             WHERE (deviceid = 162300)
             AND recorded >= '9/16/2019 11:24:00 AM' 
             AND recorded < '9/18/2019 11:24:00 AM' 
             group by deviceid, datelabel
             ), -- select * from flow_temp

              device_temp as (
                    select 
                    deviceid, 
                    tempvalue,
                    timestamp as recorded
                     from twdevicetemp
                     WHERE (deviceid = 162300)
                     AND timestamp >= '9/16/2019 11:24:00 AM' 
                     AND timestamp < '9/18/2019 11:24:00 AM' 

             ), --  select * from ambient_temp

             ambient_temp as (
              select 
                    deviceid, 
                    avg(tempvalue) as tempvalue,
                    null as flowtemp,
                    to_char(recorded, 'Mon-dd hh:00 pm') as datelabel
                    from device_temp
                    group by deviceid, datelabel
             )

             select * from ambient_temp
             union all
             select * from flow_temp

Основной вопрос: возможно ли объединить строки на основе идентификатора (в данном случае строки даты и времени)?

Headers: datetime   |  pressure   |   flow    |   consumption
         9/27 1PM        1.5           null         200
         9/27 2PM   |     2            10           50
         9/27 3pm   |   null           null          null

ETC ETC.

Спасибо всемзаранее.

1 Ответ

1 голос
/ 27 сентября 2019

Я считаю, что вы ищете присоединиться:

select coalesce(pressure.datetime, flow.datetime, consumption.datetime),
   pressure, flow, consumption
from (
   -- your pressure query here
) pressure
full outer join (
   -- your flow query here
) flow on flow.datetime=pressure.datetime
full outer join (
   -- your consumption query here
) consumption on consumption.datetime = isnull(flow.datetime,pressure.datetime)
...