Как выбрать «ноль», если есть нуль, или «макс», если в противном случае в группе выбрано?

Это упрощенный пример запроса, который я хочу выполнить:

select
  t.id,
  case when any(st.end_at is null) then null else max(st.end_at) end as max_end_at
from table as t
join sub_table as st on st.table_id = t.id
group by t.id;

Я хочу получить максимум st.end_at, но если какое-либо из вхождений равно нулю, я хочу null

Очевидно, any() не работает :/

Каким должен быть правильный подход?

🤔 А знаете ли вы, что...
SQL можно использовать для создания резервных копий и восстановления данных.


51
1

Ответ:

Решено
  • count(*) подсчитывает общее количество строк (включая ноль)
  • count(st.end_at) учитывает только ненулевые значения

Используемая логика: Если счетчики не совпадают, это означает, что что-то равно нулю, поэтому возвращается значение null, в противном случае возвращается максимальное значение даты.

select
  t.id,
  case when count(s.end_at) = count(*) then max(s.end_at) end as max_end_at
from table as t
join sub_table as st 
  on st.table_id = t.id
group by 
  t.id

вы также можете использовать IFF в снежинке:

    iff(count(s.end_at) = count(*), max(s.end_at),null) as max_end_at