2

サンプルデータ

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);

私が欲しいもの

私がする必要があるのは、ID がテーブル b と一致し、テーブル a の日付がテーブル b の最も近い 2 つの日付の間にあるテーブル a の列テキストを集計することです。望ましい出力:

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 の日付がテーブル b の最も近い 2 つの日付の間にある場所のみを集計する方法を考え出しています。どんなガイダンスも大歓迎です。

4

1 に答える 1