HAVING 与 WHERE 效果类似,用于增加过滤条件,区别是:

    位置 聚合函数 出现在 SELECT 字段
    WHERE GROUP BY 之前 不支持 无所谓
    HAVING GROUP BY 之后 支持 无所谓?

    感知上:

    • WHERE 用于原表的筛选,在计算函数之前生效,因此不能处理聚合函数和别名。
    • HAVING 用于查询结果的筛选,在计算函数之后生效,可以处理聚合函数和别名。

    用法:

    1. SELECT column_name,
    2. aggregate_function(column_name)
    3. FROM table_name
    4. GROUP BY column_name
    5. HAVING aggregate_function(column_name) operator value
    6. ORDER BY column_name

    引用文章中说“HAVING 的字段必须出现在 SELECT 语句中”,对此存疑,或许是因为不同 HIVE 版本的实现不一样。

    亲测:

    SELECT company,
           itemId,
           count(itemName) AS countItemName,
           collect_list(itemName) AS itemList FROM(
            SELECT DISTINCT company_name AS company,
                   item_id AS itemId,
                   item_name AS itemName
              FROM itemTable
            HAVING city_name = '石家庄'
           )
     GROUP BY company,
              itemId
    HAVING count(itemName) > 1
    
    • city_name 并未出现在内层 SELECT 语句中。
    • 引擎报错:SQL_SYNTAX_ERROR(USER_ERROR): Expression ‘city_name’ is not being grouped.
    • 但最终还是以 compatible mode 返回了结果,我没找到关于这个模式的说明,也没仔细对比差异在哪里。

    结论是,推荐规范化使用 HAVING 语句。

    Reference:
    https://blog.csdn.net/HD243608836/article/details/88826647?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control