内部连接未知数量的行

Inner join on unknown amount of rows

我的数据库 (postgres) 中有以下 table

CREATE TABLE "quarterly" (
    "ticker" varchar,
    "quarter_date" date,
    "statement_type" int4,
    "statement" jsonb,
    PRIMARY KEY ("ticker", "quarter_date", "statement_type")
);

现在,我想以某种方式编写查询,将具有相同日期的所有语句连接到单行中。理想的输出是这样的:

ticker, quarter_date, statement1, statement2, statement3

如果我可以根据它们的类型命名语句列,那就更好了。我第一次尝试解决这个问题是以下代码:

select Q1.ticker, Q1.quarter_date, Q1.statement, Q2.statement 
from quarterly Q1, quarterly Q2 
where Q1.quarter_date = Q2.quarter_date and Q1.ticker = Q2.ticker 

我是 sql 的新手,所以我不知道如何扩展这种方法来合并 2 个以上的语句。我现在有 4 'statement_types',将来可能会有更多。如果只用 sql 而不是在我的后端就可以做到这一点,那就太好了。有什么办法吗?

也许将交叉表与 row_number () 函数一起使用

SELECT * FROM crosstab
(
'select 
   ticker,
   quarter_date,
   row_number() over (partition by ticker,quarter_date order by statement_type) as r, 
   statement
   from quarterly order by 1,2,3')
AS ct (
   ticker varchar(15), 
   quarter_date date,
   statement1 jsonb , 
   statement2 jsonb ,
   statement3 jsonb,
   statement4 jsonb);

如果以后有人遇到类似的问题,我发现答案比使用交叉表更简单 - 但它并不适合所有人。

SELECT ticker, quarter_date, jsonb_object_agg(
    statement_type,
    statement) 
as "statements"
FROM quarterly
GROUP BY ticker, quarter_date
ORDER BY 1,2;

那是我的代码,所以我正在做的是对项目进行分组并将其聚合到 json 中。出于某种原因,我无法让交叉表工作(交叉表可能是更好的方法,但如果你问我,它的可读性要差得多)。 遗憾的是没有为每个分组项目添加新列的聚合函数:P