SQL 检查分区中是不是存在值,使用 CASE WHEN 没有任何 JOIN
Posted
技术标签:
【中文标题】SQL 检查分区中是不是存在值,使用 CASE WHEN 没有任何 JOIN【英文标题】:SQL check if value exists in a partition using CASE WHEN without any JOINSQL 检查分区中是否存在值,使用 CASE WHEN 没有任何 JOIN 【发布时间】:2018-12-20 00:01:28 【问题描述】:我真的坚持这一点。
我有一个外观相似的表格,其中包含更多可能的页面、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
,因为我在使用临时表时遇到权限错误。
目前我希望它是这样的,但是这个不起作用,给我语法错误:
SELECT *,
CASE WHEN page = 'Page4' OVER (PARTITION BY id) THEN 1 ELSE 0 END as condition
FROM my_table
有没有什么方法可以使用CASE WHEN
语句来实现通过id 来检查该值是否存在于分区的任何行中?或者也许还有其他我看不到的解决方案?
附:如果它很重要,我会使用 Redshift。
非常感谢您的帮助。
【问题讨论】:
【参考方案1】:你想要这样的逻辑:
SELECT t.*,
MAX(CASE WHEN page = 'Page4' THEN 1 ELSE 0 END) OVER (PARTITION BY id) as condition
FROM my_table t;
你的想法是对的。语法有点差。
【讨论】:
戈登,感谢您的即时答复。它真的很有帮助,我试图写这样的命令,但不包括 MAX()。为什么我需要这个? @AlexanderP 。 . .您需要某种窗口功能。做你想做的事是MAX()
。
非常感谢,现在我已经很清楚了,我已经完成了我想要的。对我来说,第一次无法正确使用 Google 搜索。非常感谢您的回答和时间。以上是关于SQL 检查分区中是不是存在值,使用 CASE WHEN 没有任何 JOIN的主要内容,如果未能解决你的问题,请参考以下文章
如何根据 PL/SQL 变量值检查输入参数值是不是存在作为列表?