Вопросы по теме «Булева логика и фильтры»

AND, OR, NOT, законы де Моргана, приоритет операторов — булева логика лежит в основе фильтрации данных в SQL и Python. На собеседовании дают сложное условие с вложенными AND/OR и просят определить, какие строки пройдут фильтр. Ошибки в логических выражениях — одна из самых частых причин неправильных результатов.

Всего в этом разделе 20 вопросов. Каждый — с правильным ответом и кратким разбором теории. Разбито на 4 части по 5 вопросов.

Качество данных и инвариантыВоронки и когортные рассужденияJOIN и кардинальностьПостановка задачиДоли и процентыSanity-check и оценкаСегментация и конфаундингТеория множеств и дедупликацияВзвешенные средние и смешение

Вопросы 15 из 20

1Какое условие является `always false` для флага `is_paying`, который принимает только 0 или 1?
A`is_paying = 1 OR is_paying = 0`
B`NOT (is_paying = 1)`
C`is_paying = 1`
D`is_paying = 1 AND is_paying = 0`
Ответ: Требование `is_paying = 1 AND is_paying = 0` является противоречием и потому `always false`.

Флаг не может одновременно быть равен 1 и 0, поэтому `is_paying = 1 AND is_paying = 0` никогда не выполнится. Такие условия иногда появляются при неверной склейке фильтров или при попытке одновременно потребовать два взаимоисключающих сегмента. Распознавание `always false` помогает понять, почему запрос возвращает пустой результат.

2В сегмент нужно включить пользователей, у которых активен хотя бы один из флагов: `is_student = 1` или `has_coupon = 1`. Какое условие соответствует формулировке «хотя бы один»?
A`is_student = 1 AND has_coupon = 1`
B`is_student = 1 OR has_coupon = 1`
C`NOT (is_student = 1 OR has_coupon = 1)`
D`(is_student = 1 AND NOT (has_coupon = 1)) OR (NOT (is_student = 1) AND has_coupon = 1)`
Ответ: Фраза «хотя бы один» соответствует логическому `OR` между условиями.

Условие `A OR B` истинно, если истинно A, или истинно B, или истинны `оба`. Это ровно соответствует «`хотя бы один` признак». Если нужна другая логика (например, `оба` или `exactly one`), то понадобится `AND` или комбинация с `NOT`.

3Условие в фильтре записали как `NOT (NOT (is_test_user = 1))`. Какое более простое условие ему эквивалентно?
A`is_test_user = 1`
B`NOT (is_test_user = 1)`
C`is_test_user = 0`
D`is_test_user = 1 OR is_test_user = 0`
Ответ: Двойное отрицание `NOT (NOT X)` эквивалентно `X`.

`NOT` инвертирует истинность выражения, а повторная инверсия возвращает исходный смысл. В фильтрах лишние `NOT` ухудшают читаемость и увеличивают шанс перепутать логику при правках. Поэтому `NOT (NOT (is_test_user = 1))` безопасно упрощается до `is_test_user = 1`.

4В сегмент «платящие и активные» должны попасть пользователи, у которых выполнены `оба` условия: `is_paying = 1` и `is_active = 1`. Какой фильтр соответствует `оба`?
A`is_paying = 1 AND is_active = 1`
B`is_paying = 1 OR is_active = 1`
C`NOT (is_paying = 1 AND is_active = 1)`
D`(is_paying = 1 AND NOT (is_active = 1)) OR (NOT (is_paying = 1) AND is_active = 1)`
Ответ: Фраза `оба` означает, что должны быть истинны обе части, поэтому используется `AND`.

Условие `A AND B` истинно только когда истинны и A, и B. Это отличается от `at least one`, где достаточно одного условия, и от `exactly one`, где одновременно истинны быть не должны. В фильтрах сегментов путаница между `AND` и `OR` — одна из самых частых причин неверной аналитики.

5Есть два флага участия в экспериментах: `in_ab_test = 1` и `in_holdout = 1`. Нужно выбрать пользователей, которые не находятся ни в одном из них. Какое условие корректно?
A`NOT (in_ab_test = 1) OR NOT (in_holdout = 1)`
B`in_ab_test = 0 OR in_holdout = 0`
C`NOT (in_ab_test = 1) AND NOT (in_holdout = 1)`
D`NOT (in_ab_test = 1 AND in_holdout = 1)`
Ответ: Фраза «ни в одном из них» для двух флагов означает `NOT (in_ab_test = 1) AND NOT (in_holdout = 1)`.

Чтобы пользователь не был ни в одном из сегментов, оба условия участия должны быть ложными одновременно, значит нужен `AND`. Ошибка — использовать `OR`: тогда достаточно, чтобы один флаг был ложным, и пользователь пройдёт, даже если другой флаг истинный. По `De Morgan` это также эквивалентно `NOT (in_ab_test = 1 OR in_holdout = 1)`.

1234

Хотите тренировать интерактивно?

В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.

Тренировать в Telegram

Другие темы: Логика

Качество данных и инвариантыВоронки и когортные рассужденияJOIN и кардинальностьПостановка задачиДоли и процентыSanity-check и оценкаСегментация и конфаундингТеория множеств и дедупликацияВзвешенные средние и смешение