我正在开发一个关于美国公司董事的数据库。我从查询中创建的一个特定表包含了在宣布破产前5年在公司中的所有董事(查询如下):
CREATE TABLE IF NOT EXISTS y_query AS
SELECT
A.dir_id, A.linked_dir_ir, A.bankrupt_co_id, A.co_name, A.event_date,
B.conn_co_id, B.conn_co_name, B.conn_co_type, B.conn_co_start_date, B.conn_co_end_date,
(CASE WHEN conn_co_start_date >= event_date THEN 1 ELSE 0 END) AS dir_hired
FROM (
SELECT
C.dir_id, C.linked_dir_ir, C.conn_co_id as bankrupt_co_id, C.overlap_start_date, C.overlap_end_date, C.conn_co_type,
D.co_name, D.filing_date, D.event_date
FROM director_network C
INNER JOIN company_bankruptcy D
ON C.conn_co_id = D.co_id
WHERE (
(C.overlap_end_date >= DATE(D.event_date, '-5 years')) AND
(C.overlap_end_date <= D.event_date))
) A
LEFT OUTER JOIN company_network B
ON A.dir_id = B.dir_id;
(linked_dir_ir
应该阅读linked_dir_id
,但我的计算机速度很慢,更改列名需要1小时才能完成。
因此,该表很好,查询需要一段时间才能运行,但它按预期工作。但是现在我需要计算每个破产公司(linked_dir_ir
)与某个董事(dir_id
)相关联的董事人数(bankrupt_co_id
)(即每一行是一个连接)导演在,和每个连接公司(conn_co_id
)。可以有很多行连接一对董事,因为如果他们中的任何一个人获得促销等,就会有新的参赛作品。
(y_query
表的几行:y_query)
所以,我认为这个查询会起作用,但我遇到了问题:
SELECT dir_id, bankrupt_co_id, conn_co_id, COUNT(DISTINCT linked_dir_ir) as conn_dirs
FROM y_query
WHERE bankrupt_co_id != conn_co_id
GROUP BY dir_id, bankrupt_co_id, conn_co_id;
我不确定为什么但是这个查询忽略了最后一个组(conn_co_id
),结果对于任何dir_id
和bankrupt_co_id
都是一样的,它们也应该根据什么变化conn_co_id
是。结果示例(仅在dir_id
或bankrupt_co_id
更改时更改,如图所示):
结果与我只与dir_id
和bankrupt_co_id
分组的结果相同,而每个conn_co_id
的结果应该不同。我已经对GROUP BY
语句进行了大量研究,以及它如何变得棘手,但我还是无法解决这个问题。我非常感谢你的帮助!
答案 0 :(得分:0)
很难重现你的结果。但是您的多个分组查询似乎没问题。见下面的例子:
CREATE TABLE test (dir_id INTEGER, bankrupt_co_id INTEGER, conn_co_id INTEGER, linked_dir_id INTEGER);
有一些虚拟数据:
select * from test;
dir_id bankrupt_co_id conn_co_id linked_dir_id
---------- -------------- ---------- -------------
1 1 1 1
1 1 1 2
1 1 1 4
1 1 1 5
1 1 1 6
1 1 1 7
1 1 2 1
1 1 2 2
1 1 2 3
1 2 2 1
3 3 2 1
3 1 2 1
3 2 2 1
3 2 2 4
1 1 1 3
1 1 4 4
包含conn_co_id
的查询会导致:
SELECT dir_id, bankrupt_co_id, conn_co_id, COUNT(DISTINCT linked_dir_id) as conn_dirs FROM test WHERE bankrupt_co_id!=conn_co_id GROUP BY dir_id, bankrupt_co_id, conn_co_id;
dir_id bankrupt_co_id conn_co_id conn_dirs
---------- -------------- ---------- ----------
1 1 2 3
1 1 4 1
3 1 2 1
3 3 2 1
而没有前两个结果合并:
SELECT dir_id, bankrupt_co_id, conn_co_id, COUNT(DISTINCT linked_dir_id) as conn_dirs FROM test WHERE bankrupt_co_id!=conn_co_id GROUP BY dir_id, bankrupt_co_id;
dir_id bankrupt_co_id conn_co_id conn_dirs
---------- -------------- ---------- ----------
1 1 4 4
3 1 2 1
3 3 2 1