【问题标题】:SQL aggregation, get string value from columnSQL聚合,从列中获取字符串值
【发布时间】:2020-11-09 10:30:04
【问题描述】:

我有一个 SQL 聚合函数,它将获取每个唯一 normalised_brand 的数据,除了我的字段“brand_gap”外,一切正常,在这个查询中,品牌“Richell”有 5 个结果,每个结果的 brand_gap 列设置为等于字符串 'no',如何从聚合函数中的 brand_gap 列获取单个字符串结果?

SELECT 
    normalised_brand, 
    COUNT(DISTINCT merch1) merch1_distinct_count,
    COUNT(DISTINCT category_level_1) category_level_1_distinct_count,
    COUNT(*) product_distinct_count,
    CONCAT(CAST(MIN(effective_price) as varchar(10)),' - ', CAST(MAX(effective_price) as varchar(10))) price_range,
    null amazon_choice,
    CAST(ROUND(COALESCE(AVG(rating),0),2) as varchar(10)) rating,
    CAST(COALESCE(SUM(review_count),0) as varchar(10)) review_count,
    SUM(CAST(questions_count AS INTEGER)) Q_and_A
    -- CONCAT(CAST(brand_gap as varchar(10)),' - ') brand_gap,
    -- FIRST (brand_gap)
FROM  
    "scoring"."final_data" 
WHERE 
    product_gap = 'yes' 
    AND store_name = 'petco' 
    AND normalised_brand = 'Richell'
GROUP BY 
    normalised_brand

所以brand_gap 列对于所有结果总是有一个值,我怎样才能得到一个brand_gap 值?喜欢选择最常出现的值吗?或选择一个随机值?还是选择第一个结果值?

谢谢

【问题讨论】:

    标签: sql presto amazon-athena


    【解决方案1】:

    您标记了错误的 DBMS。在 MySQL 中您可以使用 ANY_VALUE,您可以在 Amazon Athena 中使用 MINMAX。这无关紧要,因为组中所有行的值都是相同的。

    SELECT 
        normalised_brand, 
        ...
        MIN(brand_gap) AS brand_gap
    ...
    
    如果您只想要任何值(因为它们对于组来说都是相同的),请使用 `ANY_VALUE`:
    SELECT 
        normalised_brand, 
        ...
        ANY_VALUE(brand_gap) AS brand_gap
    ...
    
    罢工>

    【讨论】:

    • 尝试添加 ANY_VALUE(brand_gap) AS brand_gap 但收到错误 SYNTAX_ERROR: line 11:5: Function any_value not registered 我在 aws athena 顺便说一句
    • 您标记了您的请求mysql,但显然您没有使用 MySQL。然后您可以使用MINMAX。没关系,因为它们返回相同的值。我已经为你更改了请求标签。
    【解决方案2】:

    您可以使用 FIRST_VALUEFIRST 函数根据数据库按结果从组中首先获取。

    请参阅 http://www-db.deis.unibo.it/courses/TW/DOCS/w3schools/sql/sql_func_first.asp.html 以获取特定于数据库的第一个值

    SELECT 
        normalised_brand, 
        ...
        FIRST_VALUE(brand_gap) AS brand_gap
    ...
    

    可以在Selecting first and last values in a group找到其他替代方案

    【讨论】:

    • FIRST_VALUE 通常是一个窗口函数,因此在这里不合适。 FIRST 是 MS Access,如果是关于 MS Access 的话,可以在这里工作。但是,FIRST 的 w3schools 文档存在极大缺陷(不幸的是,他们的文档经常出现)。
    【解决方案3】:

    在 Athena 中有一个名为 ARBITRARY 的聚合函数,它从组中选择一个值,并且在这种情况下在语义上看起来很合适。

    【讨论】:

      猜你喜欢
      • 2017-10-11
      • 2022-09-22
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 2019-12-10
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      相关资源
      最近更新 更多