当我运行此查询时,count(0)为zip ='80005'的集合返回21。
select zip, avg(value), min(value), max(value), count(0) from values group by zip order by zip
真的有109行zip ='80005'。
以下两个查询都显示109行,它们还返回min,max和avg的不同值。
select avg(value), min(value), max(value), count(value) from values where zip='80005'
select zip, avg(value), min(value), max(value), count(value) from values group by zip having zip='80005'
值没有空值。
有没有理由为什么第一个查询在zip ='80005'的集合中返回了错误的行数?
也许这是Postgresql中的一个错误。
答案 0 :(得分:1)
我认为您希望count(*)
不是count(0)
...
答案 1 :(得分:0)
Count(1)
,Count(*)
和Count([field])
都有效。
我读过一个来源说Count(1)
和Count(*)
之间存在性能差异(据称,count(*)
需要更多处理),但是,似乎至少有证据表明对于Postgress& TSQL它没有什么区别。
答案 2 :(得分:0)
乍一看,这看起来像一个错误,很难说没有看到你的数据。
您可以尝试缩小问题的根源。
如果: -
select zip, avg(value), min(value), max(value), count(value)
from values group by zip having zip='80005'
返回109,但是: -
select zip, avg(value), min(value), max(value), count(0)
from values group by zip order by zip
为80005返回21,执行此操作时返回80005的内容: -
select zip, avg(value), min(value), max(value), count(value)
from values group by zip
答案 3 :(得分:0)
查看是否有zip 80005b的记录,其中 b 是一个或多个尾随空白。这些将整理到您的分组邮编列表中的其他位置。我相信默认情况下,PG在测试两个字符串是否相等时会忽略尾随空格,但不会在GROUP BY
中。 (你对zip字段有一个完整性检查约束吗?)