Postgres

时间:2016-06-03 02:47:28

标签: postgresql group-by

我是Postgres的新手,但不是关系数据库的新手,并且今晚写了一些奇怪的结果。有人可以帮助解释这里的计数是什么吗?

第一个查询,结果为400,000(行):

select * from mytable;

第二个查询,两个复合主键列上的组(结果很好 - 返回400,000条记录):

select PK1, PK2, count(*) cnt
  from mytable
 group by PK1, PK2

第三次查询错误地给了我超过140万条记录:

select PK1, PK2
  from mytable
 group by PK1, PK2

第二个和第三个查询之间的唯一区别是删除了count(*)字段。输出看起来不像是不同的记录 - 行是重复的。

有人知道为什么在Postgres查询中删除这个'count'字段会以这种方式扭曲输出吗?

2 个答案:

答案 0 :(得分:1)

这对我来说并不合适。 PostgreSQL组同时进行聚合。所以别的东西必须继续下去。以下是一些要排除的事情:

  1. 仔细检查行数。通过将主查询放在cte中并从中选择count(*)来完成此操作。下面是一个例子。

  2. 检查查询计划。是否存在您未考虑的连接投影问题? explain是你的朋友。

  3. 例如:

       with query (
       select PK1, PK2, count(*) cnt
         from mytable
        group by PK1, PK2
       )
       select count(*) from query;
    

答案 1 :(得分:1)

您可以采取以下措施来解决您的谜题:

首先确保表格中有准确的行数:

select count(*) from mytable

然后检查您有多少不同的PK1和PK2值:

select count(*) from (select distinct PK1 from mytable) a

select count(*) from (select distinct PK2 from mytable) a

两个值应该相等(您测试了一个唯一键),或者显着小于(没有一个是唯一键),而不是总数。

然后测试你的钥匙组合计数:

select count(*) from (select distinct PK1, PK2 from mytable) a

结果值应该相等((PK1,PK2)是唯一键),或者显着小于((PK1,PK2)不是唯一键),而不是总计数。

以下查询应该为您提供与前一个完全相同的数字:

select count(*) from (
  select PK1, PK2
  from mytable
  group by PK1, PK2) a

以及以下

中的相同值
select count(*) from (
  select PK1, PK2, count(*)
  from mytable
  group by PK1, PK2) a

最后,以下内容应该为您提供与总计数完全相同的数字:

select sum(cnt) from (
  select PK1, PK2, count(*) as cnt
  from mytable
  group by PK1, PK2) a

如果在任何时候,任何这些测试都没有给出预期的结果,那么您的数据就会严重损坏。