我的数据库如下所示: (a screenshot from my database)
+------------------------+-----------------------------+--------------+---------------+------+
| 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 |
+----------------------+-----------------------------+--------------+---------------+------+------------------+
我确定有解决此问题的代码。
最诚挚的问候,Farid
答案 0 :(得分:0)
我确定有解决此问题的代码。
当然有。通常,您应该发布问题中已经尝试过的任何代码。另外,将数据发布到图片中而不是以其他人可以复制的形式提供数据也是一种不好的形式。您还只需要发布一些人将需要回答您的问题的最小数据。
例如,在第一行中,焦点公司的客户为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)
)
使用此表结构,您的初始查询(以找出1980年之前74961D
和50590P
之间有多少个协议),您的查询将变为:
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'