SQLite - Count Divinct with three columns groupings忽略了最后一个分组

时间:2018-06-07 13:26:24

标签: sqlite

我正在开发一个关于美国公司董事的数据库。我从查询中创建的一个特定表包含了在宣布破产前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_idbankrupt_co_id都是一样的,它们也应该根据什么变化conn_co_id是。结果示例(仅在dir_idbankrupt_co_id更改时更改,如图所示):

resulting query

结果与我只与dir_idbankrupt_co_id分组的结果相同,而每个conn_co_id的结果应该不同。我已经对GROUP BY语句进行了大量研究,以及它如何变得棘手,但我还是无法解决这个问题。我非常感谢你的帮助!

1 个答案:

答案 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