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的主要内容,如果未能解决你的问题,请参考以下文章

如何检查sql的第一列或第二列中是不是存在一个特定值?

如何根据 PL/SQL 变量值检查输入参数值是不是存在作为列表?

检查 Airflow 中是不是存在 Bigquery 分区

SQL 过程错误地检查值是不是存在

oracle sql - 选择具有多个“case when”的语句并检查是不是包含文本

用于检查 NULLS 和不存在记录的 SQL Case 语句