Это упрощенный пример запроса, который я хочу выполнить:
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 можно использовать для создания резервных копий и восстановления данных.
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