【问题标题】:Aggregate function of column that has at least one type of value in a different column在不同列中具有至少一种类型值的列的聚合函数
【发布时间】:2022-01-06 02:23:26
【问题描述】:

我有下面的表格

ID | Blood_Type |  Size
B2     A           100
B2     B           200
C2     C           102
C2     O            88
G4     I            44
G4     A            100

我如何查询我上面的表格以获取我的 ID 的平均值,这些 ID 至少有一行 A 血型

预期输出:

ID | Avg_Size 
B2    150
G4     72

谢谢!

【问题讨论】:

    标签: sql snowflake-cloud-data-platform


    【解决方案1】:

    Tim 的回答很好,虽然可能不是您想要的方式,但更简单的是,以长格式执行 HAVING

    SELECT id,
        avg_size
    FROM (
        SELECT id, 
            AVG(size) AS avg_size,
            SUM(IFF(blood_type = 'A', 1, 0)) AS a_count
        FROM table
        GROUP BY id
    )
    WHERE a_count > 1;
    

    所以你可以使用 SUM 或 COUNT,它们都忽略空值,这就是 Tim 的 CASE WHEN Blood_Type = 'A' THEN 1 END 的隐含结果是一样的

    CASE 
        WHEN Blood_Type = 'A' THEN 1 
        ELSE NULL
    END
    

    如果您使用 SUM,它可以处理空值或零,因此可以使用 IFF,我喜欢它,因为它更小,更明确地说明正在发生的事情。

    因此蒂姆的答案可以换成SUM(IFF 喜欢:

    SELECT 
        id,
        AVG(size) AS avg_size
    FROM table
    GROUP BY id
    HAVING SUM(IFF(Blood_Type = 'A',1, 0) > 0;
    

    【讨论】:

    • SUM(IFF(Blood_Type = 'A',1, 0) > 0 可以替换为 COUNT_IF(Blood_Type='A') > 0 COUNT_IF
    • @LukaszSzozda 哇。繁荣!更加简洁明了。
    【解决方案2】:

    您可以在此处尝试聚合,并在 HAVING 子句中使用断言:

    SELECT ID, AVG(Size) AS Avg_Size
    FROM yourTable
    GROUP BY ID
    HAVING COUNT(CASE WHEN Blood_Type = 'A' THEN 1 END) > 0;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      相关资源
      最近更新 更多