SQL: как объединить две строки в одной таблице на основе одной и той же временной метки?

#sql #postgresql

#sql #postgresql

Вопрос:

Это таблица вывода данных в PostgreSQL.
Я ищу способ объединить строки 7 и 8 в условии метки времени, чтобы удалить значения [null].

databaseSnapshot

Это ожидаемый результат, который я ищу.
Так что у меня будет только одна строка, когда временная метка совпадает.

 --------------------------------------------------------
05:32:33          | Pump2Stop           | 49                    
--------------------------------------------------------
  

Есть идеи, как это можно сделать?

Комментарии:

1. Будет только две строки с совпадающими временными метками?

Ответ №1:

предполагая, что у вас есть только одна запись на временную метку с ненулевым значением в определенном столбце, попробуйте следующее:

 SELECT to_timestamp, MAX(str_v), MAX(long_v)
FROM table
GROUP BY to_timestamp;
  

Ответ №2:

Вы можете использовать самосоединение

 select stp.to_timestamp, 
       stp.str_v,
       strt.long_v
from the_table stp
  join the_table strt 
    on stp.to_timestamp = strt.to_timestamp
   and strt.str_v is null
where stp.str_v = 'Pump2Stop'
  

Ответ №3:

Если я правильно понимаю, вы хотите, чтобы все строки — с указанными объединенными строками. Основываясь на вашем комментарии, я думаю, это делает то, что вы хотите:

 select t1.to_timestamp, t1.str_v
       coalesce(t2.long_v, t1.long_v)
from t t1 left join
     t t2
     on t.to_timestamp = t2.to_timestamp and
        t.str_v in ('Pump2Stop', 'Pump2Stop')
where t1.str_v is not null;
  

Вы также можете использовать оконную функцию:

 select t.to_timestamp, t.str_v,
       coalesce(long_v, imputed_long_v) as long_v
from (select t.*,
             max(long_v) over (partition by to_timestamp) as imputed_long_v
      from t
     ) t
where str_v is not null;