Я хочу посчитать количество предварительных соглашений между фирмами и назначить этот счет для целевой фирмы - PullRequest
0 голосов
/ 16 октября 2018

Вот так выглядит моя база данных: ( скриншот из моей базы данных )

+------------------------+-----------------------------+--------------+---------------+------+
|         p_par          | fk_ior_sdc_alliances_id_par | pcusip_focal | cusip_partner | year |
+------------------------+-----------------------------+--------------+---------------+------+
| "APA Ventures II"      |                         337 | "00185D"     | "032515"      | 1983 |
| "APA Ventures II"      |                         247 | "00185D"     | "46204Q"      | 1985 |
| "APA Ventures II"      |                         178 | "00185D"     | "032515 "     | 1985 |
| "APA Ventures II"      |                         335 | "00185D"     | "00282M "     | 1985 |
| "ARCO Chemical Co"     |                          85 | "001920"     | "45166A"      | 1985 |
| "ARCO Chemical Co"     |                          27 | "001920"     | "816077 "     | 1985 |
| "ARCO Chemical Co"     |                          98 | "001920"     | "22748D "     | 1985 |
| "ARI Technologies Inc" |                          79 | "00204K"     | "49461M "     | 1985 |
| "Abbott Biotech Inc"   |                         334 | "00282M"     | "00185D"      | 1982 |
| "Abbott Biotech Inc"   |                         334 | "00282M"     | " 00185D"     | 1983 |
| "Abbott Biotech Inc"   |                         335 | "00282M"     | "00185D"      | 1985 |
| "Abbott Biotech Inc"   |                         342 | "00282M"     | "89352X"      | 1985 |
| "Abbott Biotech Inc"   |                         329 | "00282M"     | "00790H "     | 1985 |
| "Aall Bank and Trust"  |                          40 | "00291B"     | "040453 "     | 1985 |
| "Abingworth PLC"       |                         103 | "00358Q"     | "370476 "     | 1985 |
| "Abingworth PLC"       |                         312 | "00358Q"     | "53655Q"      | 1985 |
| "Abingworth PLC"       |                         367 | "00358Q"     | "12664T"      | 1985 |
| "Abingworth PLC"       |                          38 | "00358Q"     | "53655Q "     | 1985 |
| "Abingworth PLC"       |                         333 | "00358Q"     | "69643R "     | 1985 |
| "Abingworth PLC"       |                         195 | "00358Q"     | "74763I "     | 1985 |
| "Abingworth PLC"       |                         269 | "00358Q"     | "87926F "     | 1985 |
| "Abingworth PLC"       |                         164 | "00358Q"     | " 108046"     | 1985 |
| "Abingworth PLC"       |                         328 | "00358Q"     | "88117R "     | 1985 |
| "Abingworth PLC"       |                         442 | "00358Q"     | "595141 "     | 1985 |
| "Abingworth PLC"       |                         243 | "00358Q"     | "34416D "     | 1985 |
| "Abingworth PLC"       |                         237 | "00358Q"     | "827056 "     | 1985 |
| "Abingworth PLC"       |                         198 | "00358Q"     | "12465I "     | 1985 |
+------------------------+-----------------------------+--------------+---------------+------+

У меня есть специализированная фирма и ее соглашения с другими фирмами.В основном соглашения являются двусторонними (имеется в виду только один партнер), но есть и многосторонние.То, что я хочу сделать, это подсчитать предыдущие соглашения между теми же фирмами.Например, в строке firts значение cusip для целевой компании составляет 74961D (PCUSIP_par), а для партнера - 50590P.Я хочу посчитать, сколько раз до 1980 года эта комбинация случалась.

В случае многосторонних соглашений я намереваюсь создать комбинации, такие как Focal-partner_1, Focal-partner_2, Focal_partner_3 и т. Д. Затем я подведу итоги и назначу этот номер фокальной фирме (в один ряд).Я не рассматриваю соглашения между или между партнерами.

Ожидаемые данные:

+----------------------+-----------------------------+--------------+---------------+------+------------------+
|        p_par         | fk_ior_sdc_alliances_id_par | pcusip_focal | cusip_partner | year | prior_agreements |
+----------------------+-----------------------------+--------------+---------------+------+------------------+
| "APA Ventures II"    |                         337 | "00185D"     | "032515 "     | 1983 |                0 |
| "APA Ventures II"    |                         178 | "00185D"     | "032515 "     | 1985 |                1 |
| "Abbott Biotech Inc" |                         334 | "00282M"     | " 00185D"     | 1982 |                0 |
| "Abbott Biotech Inc" |                         334 | "00282M"     | " 00185D"     | 1983 |                1 |
| "Abbott Biotech Inc" |                         335 | "00282M"     | " 00185D"     | 1985 |                2 |
+----------------------+-----------------------------+--------------+---------------+------+------------------+

Я уверен, что существует код для решения этой проблемы.

С уважением, Фарид

1 Ответ

0 голосов
/ 16 октября 2018

Я уверен, что есть код для решения этой проблемы.

Конечно, есть.Как правило, вы должны опубликовать любой код, который вы уже пробовали в своем вопросе.Кроме того, неправильно размещать данные на картинке, а не предоставлять их в форме, которая может быть скопирована другими пользователями.Вам также нужно только опубликовать минимальные данные, которые понадобятся кому-то для ответа на ваш вопрос.

Например, в первом ряду ключевая фирма имеет значение 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'
...