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;

У вас правильная идея. Синтаксис немного выключен.

Другие вопросы по тегам