SQL 使用不带任何 JOIN 的 CASE WHEN 检查分区中是否存在值

SQL check if value exists in a partition using CASE WHEN without any JOIN

我真的坚持这一点。

我有一个 table 类似的外观,有更多可能的页面、ID 和其他列,但我坚持使用这些。

+--------+-------+------+--+
| 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 |  |
+--------+-------+------+--+

我的目标是检查页面是否出现在 id 的分区中,如果是,则在新列中为组的每一行放置 1。

f.e。如果我要检查 '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,因为我在使用临时 table 时遇到权限错误。

目前我希望它是这样的,但是这个不起作用,给我语法错误:

SELECT *,
CASE WHEN page = 'Page4' OVER (PARTITION BY id) THEN 1 ELSE  0 END as condition
FROM my_table

有什么方法可以使用CASE WHEN语句通过id检查分区的任何行中是否存在该值?或者也许还有其他一些我没有看到的解决方案?

P.S。如果它很重要,我正在使用 Redshift。

非常感谢您的帮助。

你想要这样的逻辑:

SELECT t.*,
       MAX(CASE WHEN page = 'Page4' THEN 1 ELSE 0 END) OVER (PARTITION BY id) as condition
FROM my_table t;

你的想法是对的。语法有点偏差。