Внутреннее соединение с неизвестным количеством строк

У меня есть следующая таблица в моей БД (postgres)

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, поэтому я не знаю, как расширить этот подход, чтобы объединить более двух операторов. Теперь у меня есть 4 'statement_types' и может быть больше в будущем. Было бы здорово, если бы это можно было сделать только с помощью sql, а не в моем бэкэнде. Есть ли способ сделать это?

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
2
0
31
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Возможно, используйте кросс-таблицу с функцией 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

Другие вопросы по теме