【问题标题】:Using a Count condition in a Case statement to classify a variable在 Case 语句中使用 Count 条件对变量进行分类
【发布时间】:2018-05-01 15:07:38
【问题描述】:

我试图计算一个值在一列中出现的次数,按 ID 分组。这是一个示例数据集:

ID      Yes_or_No
1       Yes
1       No
2       Yes
3       Yes
4       Yes
4       No
5       Yes

一般的想法是,如果我计算某个 ID 的不同值,如果该计数大于 1,那么我可以创建一个新列,将其称为“可能”,例如当某个 ID 同时出现“是”和“否”值。这是我最初写的,但不起作用:

SELECT  ID,
        CASE WHEN COUNT(DISTINCT Yes_or_No)>1 AS 'Maybe'
        ELSE Yes_or_No
        END AS YesNoMaybe
FROM db
GROUP BY 1;

这是一个更大的整体查询的一部分,因此,理想情况下,我希望能够在 Case 语句中使用 Count,而不是在 FROM 语句中使用子查询,以节省内存。欢迎使用其他解决方法。

【问题讨论】:

  • 您使用的是哪个 dbms? (该查询尝试包含特定于产品的内容。)
  • 我在 Vertica 中使用 SQL。

标签: sql count case vertica


【解决方案1】:

你需要把AS改成THEN

SELECT  ID,
        CASE WHEN COUNT(DISTINCT Yes_or_No)>1 THEN 'Maybe'
        ELSE MIN(Yes_or_No)    --here agg function is required
        END AS YesNoMaybe
FROM db
GROUP BY ID;   --GROUP BY 1 is antipattern (explicit name >> position)

DBFiddle Demo

【讨论】:

  • 这行得通!使用 AS 是一个草率的错误。我未能做出的另一个区别是在我的 ELSE 子句下使用了 MIN 语句。
【解决方案2】:

你的 case 表达式应该是

SELECT  ID,
        (CASE WHEN COUNT(DISTINCT Yes_or_No) > 1 
              THEN 'Maybe' ELSE MIN(Yes_or_No)
         END) AS YesNoMaybe
FROM db
GROUP BY ID;

As 不是case 表达式的一部分,它是select 语句的一部分,用于定义 alise 或table alise

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    相关资源
    最近更新 更多