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;
你的想法是对的。语法有点偏差。
我真的坚持这一点。
我有一个 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;
你的想法是对的。语法有点偏差。