#sql #postgresql
#sql #postgresql
Вопрос:
Это таблица вывода данных в PostgreSQL.
Я ищу способ объединить строки 7 и 8 в условии метки времени, чтобы удалить значения [null].
Это ожидаемый результат, который я ищу.
Так что у меня будет только одна строка, когда временная метка совпадает.
--------------------------------------------------------
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;