双Group by 条件对表进行分组实现与理解 以及SQL的一些底层理解总结(索引、关系数据库、SQL执行顺序)

本文探讨了如何通过调整SQL语句,对BGTAMAQA项目中的数据进行双分组查询,即按时间与缺陷名称汇总缺陷数量和面积。通过去除冗余字段并使用GROUP BY和SUM函数,提升了后台查询性能,同时介绍了索引在查询速度上的关键作用。

继上篇博客的开发任务,为减小前台处理的数据量,在后台查询时对SQL进行优化,对如下所示表进行双分组查询

对于group by的理解参考链接: 关于group by的用法 原理.

需求:根据时间分组求不同时间组内部 不同缺陷名称的缺陷个数与面积之和 两个group by
在这里插入图片描述
原SQL:

SELECT  
    PRODUCE_TIME,
    DEFECT_COUNT,
    DEFECT_AREA,
    DEFECT_CNAME
FROM
    BGTAMAQA.T_ADS_FACT_HR_DEFECT_STATISTICS
WHERE
    1=1
AND DEFECT_CNAME NOT IN ('NULL','',' ')
AND PRODUCE_TIME >= '20201202092942'
AND PRODUCE_TIME <= '20210205092942'
group by PRODUCE_TIME
ORDER BY
    PRODUCE_TIME DESC,
    DEFECT_CNAME DESC 
FETCH
    FIRST 49999999 rows only

改为:

SELECT
    sum(DEFECT_COUNT),
    sum(DEFECT_AREA),
    SUBSTR(PRODUCE_TIME,1,10) as TIME,
    DEFECT_CNAME
FROM
    BGTAMAQA.T_ADS_FACT_HR_DEFECT_STATISTICS
WHERE
    1=1
AND DEFECT_CNAME NOT IN ('NULL','',' ')
AND PRODUCE_TIME >= '20201202092942'
AND PRODUCE_TIME <= '20210205092942'
group by
SUBSTR(PRODUCE_TIME,1,10),DEFECT_CNAME
order by TIME
FETCH
    FIRST 49999999 rows only

原理:
执行Group BY 后,想象生成了虚拟表3,多行合并,所有的其他字段值写到一个单元格里面。单元格中是不允许有多个值的,所以就必须配合聚合函数使用group by语句了
什么是索引.
不借助任何索引结构快速定位的话,查找某条记录,就要逐行去查找比较。
但如果对该列数据构建了二叉树、红黑树等数据结构的索引,将字段值全部放在该数据结构中,查找时就会快很多(例如根据值大小构建二叉排序树实现快速查找)
数据库索引有哪些呢?

(明明自己的项目需求,自己记录的知识跟我说检查转载…明明不一样,绝了)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值