Счетчик SQL (*) дает неправильный ответ при использовании с группой по - PullRequest
2 голосов
/ 12 августа 2011

Когда я запускаю этот запрос, count (0) возвращает 21 для набора с zip = '80005'.

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.

Ответы [ 4 ]

1 голос
/ 12 августа 2011

Я думаю, что вы хотите count(*) не count(0) ...

0 голосов
/ 24 августа 2011

Посмотрите, есть ли у вас записи с zip 80005b, где b - это один или несколько конечных пробелов. Они будут сопоставлять где-то еще в вашем сгруппированном списке почтовых индексов. Я считаю, что по умолчанию PG игнорирует завершающие пробелы при проверке двух строк на равенство, но не в GROUP BY. (У вас есть ограничение проверки работоспособности на поле почтового индекса?)

0 голосов
/ 13 августа 2011

На первый взгляд это похоже на ошибку, трудно сказать, не видя ваших данных.

Вы можете попытаться сузить источник проблемы.

Если это: -

  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

возвращает 21 для 80005, что возвращается для 80005, когда вы делаете это:-

  select zip, avg(value), min(value), max(value), count(value) 
  from values group by zip
0 голосов
/ 12 августа 2011

Count(1), Count(*) и Count([field]) все работают.

Был один источник, который я прочитал, в котором говорилось о разнице в производительности между Count(1) и Count(*) (предположительно, count(*) требовала дополнительной обработки), однако, как представляется, для Postgress & TSQL есть доказательства, что не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...