当前位置: 首页 > news >正文

Hive SQL:where 与 having(城市分组,年龄筛选)

统计每个城市中 30 岁以上的用户数量

SELECT city, COUNT(user_id) AS user_count 
FROM user_info WHERE age > 30 
GROUP BY city;

一、能不能用 HAVING 替代 WHERE ?

可以改,但逻辑会变,而且不推荐这么做,先看改写后的 SQL:

SELECT city, COUNT(user_id) AS user_count
FROM user_info
GROUP BY city
HAVING age > 30; 

但这样写 有问题 !因为:

  • HAVING 是对 分组后结果 过滤,它能用到的字段,要么是 GROUP BY 里的分组字段(如 city ),要么是聚合函数(如 COUNT(user_id) )。
  • 原表的 age 字段,不是分组字段、也不是聚合结果 ,放到 HAVING 里会报错(或结果异常)。

如果非要用 HAVING 实现类似逻辑,得先把 age 用聚合函数处理(但这不符合需求),比如:

-- 逻辑不对,只是演示语法,别这么用!
SELECT city, COUNT(user_id) AS user_count
FROM user_info
GROUP BY city, age  -- 把 age 也当分组字段(但需求不是按城市+年龄分组)
HAVING age > 30; 

这样虽然语法能跑,但统计的是 “城市 + 年龄” 分组 的结果,和需求 “每个城市中 30 岁以上用户数量” 完全不符,所以 不能这么替代 。

二、执行顺序:WHERE(筛选)先于 GROUP BY(分组)

SQL 的执行顺序是 固定规则 ,不是 “无所谓”,流程是:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY

对应到需求:

  1. FROM user_info:先确定要查的表。
  2. WHERE age > 30先过滤出所有 “年龄> 30 岁” 的用户记录(把年龄≤30 的直接筛掉,不参与后续分组 )。
  3. GROUP BY city:对过滤后的结果,按 city 分组。
  4. COUNT(user_id):统计每个城市分组里的用户数量。

如果反过来,先分组再筛选(用 HAVING 硬写 ),就会因为分组后拿不到原始 age 字段(或拿到的是错误逻辑的分组结果 ),导致统计结果不对。

三、题目需求的正确逻辑:先筛 “年龄> 30”,再按城市分组

题目要 “每个城市中 30 岁以上的用户数量”,核心是 先把 30 岁以上的用户挑出来,再按城市统计这些人的数量 。

如果错误地 “先分组(按城市),再筛年龄”,会出现两种问题:

  1. 分组后,每个城市里的 age 是零散值(不是聚合结果 ),HAVING 无法直接用原始 age 过滤(语法 / 逻辑都不对 )。
  2. 即使强行分组 +HAVING,统计的也是 “城市分组里包含年龄> 30 记录” 的情况,结果会混乱(比如一个城市里有 20 岁和 40 岁的人,分组后 HAVING age>30 可能误判 )。

四、总结:执行顺序是 SQL 规则,必须遵守

  • WHERE 作用:分组前,过滤原始表的行记录(筛掉不需要的数据,减少分组压力 )。
  • HAVING 作用:分组后,过滤分组的结果(只能用分组字段、聚合函数 )。
http://www.dtcms.com/a/470886.html

相关文章:

  • C# 枚举(Enum)
  • 松江网站建设哪家好手机网站开发计划
  • 模板网站如何做seo网站维护html模板
  • PostgreSql 判断字符串是否为null 或 空字符串
  • 我做外贸要开国际网站吗个人网站cms
  • VR全景园区完整实现方案
  • GPS与北斗组合单点定位算法MATLAB实现
  • PostgreSQL 中 CTE 的使用
  • 网站开发语言怎么样wordpress底板版权
  • 【C语言加油站】C语言文件操作详解:从“流”的概念到文件的打开与关闭​
  • 涪陵网站建设公司国内可以上的网站
  • 国产CAD皇冠CAD(CrownCAD)三维建模教程:变压器
  • 网站博客程序logo智能设计一键生成器
  • 网站空间可以通过什么获取专业做鞋子的网站有哪些
  • 优秀企业网站设计欣赏电商网站建设意义
  • PwnKit提权漏洞复现:原理分析+环境搭建+渗透实践(CVE-2021-4034)
  • 李宏毅机器学习笔记19
  • 腾讯建设网站视频下载深圳坪山天气
  • 群晖wordpress主机兰州seo新站优化招商
  • Go语言实现HTML转PDF
  • 深入解析Java NIO:从BIO到Reactor模式的网络编程演进
  • 公司怎么做网站推广北京西站停车场收费标准
  • 企业网站系统手机版住房与城乡建设部建设环境工程技术中心网站
  • 非法期货做网站安康信息平台
  • MySQL安装包下载成功,如何跨版本备份迁移无忧?
  • ASM架构基础与核心概念
  • 每天五分钟深度学习:正则化技术解决过拟合(高方差)问题
  • 局域网建设个人网站美食网站设计论文
  • 使用 systemd 管理 MySQL 服务
  • 做网站客户最关心哪些问题下载百度电商平台app