Я уверен, что есть код для решения этой проблемы.
Конечно, есть.Как правило, вы должны опубликовать любой код, который вы уже пробовали в своем вопросе.Кроме того, неправильно размещать данные на картинке, а не предоставлять их в форме, которая может быть скопирована другими пользователями.Вам также нужно только опубликовать минимальные данные, которые понадобятся кому-то для ответа на ваш вопрос.
Например, в первом ряду ключевая фирма имеет значение 74961D (PCUSIP_par), а партнерская - 50590P.Я хочу посчитать, сколько раз до 1980 года эта комбинация случалась.
Это просто: просто добавьте ваши условия к вашему предложению WHERE
и используйте агрегатную функцию COUNT
:
SELECT COUNT(*) AS agreement_count
FROM agreements
WHERE
PCUSIP_par = '74961D'
AND partner_cusip_1 = '50590P'
AND sdc_year < 1980
В случае многосторонних соглашенийЯ намерен проводить комбинации, такие как Focal-partner_1, Focal-partner_2, Focal_partner_3 и т. Д. Затем я подведу итоги и назначу этот номер фокальной фирме (в один ряд).Я не рассматриваю соглашения между или между партнерами.
Я не совсем уверен, что вы спрашиваете здесь.Возможно, если вы проясните свою логику и предоставите некоторые ожидаемые данные.
После всего сказанного ваша модель данных действительно нуждается в пересмотре.Обычно это «запах кода», когда у вас есть несколько столбцов с почти одинаковыми именами (как вы делаете с partner_cusip_1
, partner_cusip_2
и partner_cusip_3
).Для соглашений с более чем 4 сторонами вам придется начинать добавлять столбцы, что значительно увеличивает накладные расходы (написание запросов, снижение производительности и упрощение ошибок).
Я бы порекомендовал другоймодель: Хранение информации о базовом соглашении (например, sdc_year
и, возможно, "основной" фирмы) в одной таблице, а затем сохранение информации о вашем партнере в другой таблице:
CREATE TABLE agreements
(
agreement_id SERIAL PRIMARY KEY,
sdc_year INT -- or have this be a TIMESTAMP,
PCUSIP_focal -- add a foreign key if you have a table of CUSIPs somewhere
)
CREATE TABLE agreement_partners
(
agreement_id REFERENCES agreements(agreement_id),
partner_cusip, -- add a foreign key if you have a table of CUSIPs somewhere
PRIMRY KEY (agreement_id, partner_cusip)
)
При такой структуре таблицы ваши начальныезапрос (чтобы выяснить, сколько соглашений между 74961D
и 50590P
до 1980 года было), ваш запрос становится:
SELECT COUNT(*) AS agreement_count
FROM agreements a
INNER JOIN agreement_partners ap ON
ap.agreement_id = a.agreement_id
WHERE
a.sdc_year < 1980
AND a.pcusip_focal = '74961D'
AND ap.partner_cusip = '50590P'