Выборочные данные
CREATE TEMP TABLE a AS
SELECT id, adate::date, name
FROM (VALUES
(1,'1/1/1900','test'),
(1,'3/1/1900','testing'),
(1,'4/1/1900','testinganother'),
(1,'6/1/1900','superbtest'),
(2,'1/1/1900','thebesttest'),
(2,'3/1/1900','suchtest'),
(2,'4/1/1900','test2'),
(2,'6/1/1900','test3'),
(2,'7/1/1900','test4')
) AS t(id,adate,name);
CREATE TEMP TABLE b AS
SELECT id, bdate::date, score
FROM (VALUES
(1,'12/31/1899', 7),
(1,'4/1/1900' , 45),
(2,'12/31/1899', 19),
(2,'5/1/1900' , 29),
(2,'8/1/1900' , 14)
) AS t(id,bdate,score);
Что я хочу
Что мне нужно сделать, это совокупный текст столбец из таблицы а где идентификатор соответствует таблице b, а дата из таблицы a находится между двумя ближайшими датами из таблицы b. Желаемый результат:Совокупный текст столбцов, даты в таблице а находятся между датами в таблице б
id date score textagg
1 12/31/1899 7 test, testing
1 4/1/1900 45 testinganother, superbtest
2 12/31/1899 19 thebesttest, suchtest, test2
2 5/1/1900 29 test3, test4
2 8/1/1900 14
Мои мысли сделать что-то вроде этого:
create table date_join
select a.id, string_agg(a.text, ','), b.*
from tablea a
left join tableb b
on a.id = b.id
*having a.date between b.date and b.date*;
, но я действительно борется с последней строки, выяснить, как агрегировать только тогда, когда дата в таблице Ь между ближайшие две даты в таблице b. Любое руководство очень ценится.
Схема с повторяющимися значениями в 'id' не имеет большого смысла. Сказав это, проверьте тип данных 'tsrange' и посмотрите, можете ли вы использовать его для этой цели. –
Ваш пример не работает,' superbtest' не * между * соответствующими датами в таблице 'b'. Также отсутствуют определения таблиц и версия Postgres. –
Обратите внимание, что нужный результат не в первой нормальной форме. Разве вам не лучше иметь что-то вроде (id, date, score, text) с 9 строками вывода? –