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

Ale*_*r P 7 sql amazon amazon-redshift

我真的坚持这一点。

我有一个外观相似的表格,其中包含更多可能的页面、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 |  |
+--------+-------+------+--+
Run Code Online (Sandbox Code Playgroud)

我的目标是检查页面是否出现在 id 的分区中,如果这是真的,那么在新列中为组的每一行放置 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         |
+--------+-------+------+-----------+
Run Code Online (Sandbox Code Playgroud)

我想使用,CASE WHEN因为我以后要写更复杂的条件。对我来说最烦人的部分是我无法使用任何一个,JOIN因为在使用临时表时出现权限错误。

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

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

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

PS如果重要的话,我正在使用Redshift。

我真的很感激一些帮助。

Gor*_*off 6

你想要这样的逻辑:

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

你有正确的想法。语法有点差。

  • 非常感谢,现在事情对我来说非常清楚,我已经做到了我想要的。当我无法正确地谷歌某些东西时,对我来说是第一次。我非常感谢您的回答和时间。 (2认同)