SQL проверяет, существует ли значение в разделе, используя CASE WHEN без какого-либо JOIN
Я действительно застрял на этом.
У меня есть таблица с похожим внешним видом с гораздо большим количеством возможных страниц, идентификаторов и других столбцов, но это те, на которых я застрял.
+--------+-------+------+--+
| page | id | time | |
+--------+-------+------+--+
| Page1 | A | 1 | |
| Page2 | A | 3 | |
| Page3 | A | 5 | |
| Page1 | A | 3 | |
| Page5 | A | 4 | |
| Page6 | B | 3 | |
| Page6 | B | 7 | |
| Page4 | B | 4 | |
+--------+-------+------+--+
Моя цель состоит в том, чтобы проверить, появляется ли страница в разделе идентификатора, и если это правда, чем поставить 1 для каждой строки группы в новом столбце.
Например, если я пытаюсь проверить "Page4", это должно выглядеть так.
+--------+-------+------+-----------+
| page | id | time | condition |
+--------+-------+------+-----------+
| Page1 | A | 1 | 0 |
| Page2 | A | 3 | 0 |
| Page3 | A | 5 | 0 |
| Page1 | A | 3 | 0 |
| Page5 | A | 4 | 0 |
| Page6 | B | 3 | 1 |
| Page6 | B | 7 | 1 |
| Page4 | B | 4 | 1 |
+--------+-------+------+-----------+
Я хочу использовать CASE WHEN
потому что я собираюсь написать более сложные условия позже. И самое неприятное для меня то, что я не могу использовать JOIN
потому что я получаю ошибку разрешения при использовании временных таблиц.
На данный момент я хочу, чтобы это было что-то вроде этого, но этот не работает, давая мне синтаксическую ошибку:
SELECT *,
CASE WHEN page = 'Page4' OVER (PARTITION BY id) THEN 1 ELSE 0 END as condition
FROM my_table
Есть ли способ реализовать проверку, существует ли значение в любой строке раздела по идентификатору, используя CASE WHEN
заявление? Или, может быть, есть какое-то другое решение, которого я просто не вижу?
PS Я использую Redshift, если это важно.
Я был бы очень признателен за помощь.
1 ответ
Вы хотите логику, как это:
SELECT t.*,
MAX(CASE WHEN page = 'Page4' THEN 1 ELSE 0 END) OVER (PARTITION BY id) as condition
FROM my_table t;
У вас правильная идея. Синтаксис немного выключен.