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。
我真的很感激一些帮助。
你想要这样的逻辑:
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)
你有正确的想法。语法有点差。