Pull to refresh

Comments 5

Если выполнить первый запрос(закомментированный), то получим довольно странное значение — 0 записей у которых не указана каюта. Это связано с особенностями работы агрегирующих функций. Не умеет правильно складывать пустые значения.

На самом деле это фича, а не баг! Если вам нужно посчитать кол-во записей, используйте count(*). count(значение) считает именно количество значений, а null — отсутствие значения, его считать не надо. Эту особенность удобно использовать, если вам надо посчитать сущности с определенными свойствами, при этом не нужно ограничивать всю выборку в блоке where, так как это повлияет на выборку сущностей с другими свойствами:
select
  count(*) as TOTAL,
  count(case when sex = 'male' then 1 else null end) as MALE_TOTAL,
  count(case when sex = 'female' then 1 else null end) as FEMALE_TOTAL,
  count(case when sex = 'male' and age>=60 then 1 else null end) as OLD_MALE_TOTAL,
  count(case when sex = 'female' and age>=60 then 1 else null end) as OLD_FEMALE_TOTAL,
  count(case when age<=16 then 1 else null end) as CHILDREN_TOTAL
from titanik_test_1
Да, это та еще фича. Немало приятных моментов при отладке доставили null values.
На счет count(*) — думал, но решил что лучше передать маленькое не nullable поле, целочисленное вместо *. Думаю с запасом на большие таблицы — * на миллионах будет помедленнее.
Для счета идеально подходит поле primary key — оно маленькое и гарантированно без null-ов (что вы и сделали). За postgres не скажу, но в Oracle нет никаких проблем с count(*) — он считает количество записей (строк), в содержимое записей даже не заглядывая, соответственно делает это быстро.
там в титанике какой то чел с первого сабмита вышел на первое место с 0.96651, ваще мощь -)
Да, жесть. Вот уже скоро допишу третью — четвертую часть, посмотрим какой будет результат. Хорошо если лучше базовых наборов :)
Sign up to leave a comment.

Articles