Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >高级SQL查询技巧——利用SQL改善和增强你的数据

高级SQL查询技巧——利用SQL改善和增强你的数据

作者头像
云原生
发布于 2021-05-31 03:41:43
发布于 2021-05-31 03:41:43
5.8K00
代码可运行
举报
文章被收录于专栏:云原生实践云原生实践
运行总次数:0
代码可运行

关系数据库系统和混合/云数据管理解决方案的用户都可以使用SQL灵活地访问业务数据,并以创新的方式进行转换或显示。

对业务数据库结构的透彻了解,对上游数据进行转换和聚合的巧妙解决方案,对于高效,完善的ETL至关重要。这是我在构建复杂的管道时学到的一些技巧,这些技巧使我的工作轻松而有趣。

一、计算滚动平均

使用时间序列数据时,为观察值计算滚动平均值或附加历史值可能会有所帮助。假设我想获取一家公司每天售出的小部件数量。我可能想包括7天移动平均线,或附上上周出售的工作日小部件,以查看业务与上周相比的表现。我可以通过将数据集连接到自身上,并使用日期列上的操作来选择单个值或观察范围来做到这一点。

首先,让我们开始使用Db2库中名为WIDGET_ORDER_HISTORY的表中的以下代码,按日销售小部件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select t1.date
  , sum(t1.widgets_sold) as total_widgets_sold
from db2.widget_order_history t1
where t1.date between ‘20210405’ and ‘20210501’
group by t1.date

如果我们想在表的另一个变量(例如特定存储)上添加任何过滤条件,则可以添加一个简单的WHERE语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select t1.date
   , sum(t1.widgets_sold) as total_widgets_sold
from db2.widget_order_history t1
where (t1.date between ‘20210405’ and ‘20210501)
   and t1.store = 1234
group by t1.date

位于其他表上的其他条件(即STORE_DATA)将需要附加的INNER JOIN:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select t1.date
   , sum(t1.widgets_sold) as total_widgets_sold
from db2.widget_order_history t1
inner join (
   select store
   from db2.store_data
   where state =NY) t2
on t1.store = t2.store
where t1.date between ‘20210405’ and ‘20210501’
group by t1.date

从提供的代码生成的示例时间序列数据:

二、自连接附加历史数据

现在,如果我想附加4/25 / 21–5 / 1/21这一周的7天滚动平均值,可以通过将表连接到自身上并利用在SUM()函数。

当您只想满足表中的特定条件时,可以使用此技术来使用分组功能(即SUM(),COUNT(),MAX())。它只会对满足WHEN子句中包含的规则的值求和。

在下面的示例中,如果表B的值在表A上当前观察日期的前7天之内,我们可以将这些销售量相加并除以7,以获得表A的每一行的每周滚动平均值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select a.date
, a.total_widgets_sold
   , sum(
   case when (b.date between a.date-7 and a.date-1) 
   then b.total_widgets_sold 
   else 0 
   end)/7 as seven_day_avg
from (
   select date
      , sum(widgets_sold) as total_widgets_sold
   from db2.widget_order_history
   where date between ‘20210425’ and ‘20210501’
   group by date
) a
left join (
   select date
      , sum(widgets_sold) as total_widgets_sold
   from db2.widget_order_history
   where date between ‘20210405’ and ‘20210501’
   group by date
) b
on a.date = b.date
group by a.date
   , a.total_widgets_sold
order by a.date

2021日历年第17周的小部件销售,其7天平均值处于滚动状态:

如果要将历史值附加到每个观察值,则可以避免聚合,而只需根据指定间隔时间的日期加入表即可。

下面的示例将表B联接到表A上,以将日期回溯7天以获取前一个工作日的小部件销售:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select a.date
   , a.total_widgets_sold
   , b.total_widgets_sold as prev_wkday_sales
from (
   select date
      , sum(widgets_sold) as total_widgets_sold
   from db2.widget_order_history
   where date between ‘20210425’ and ‘20210501’
   group by date
) a
left join (
   select date
      , sum(widgets_sold) as total_widgets_sold
   from db2.widget_order_history
   where date between ‘20210404’ and ‘20210501’
   group by date
) b
on a.date -7 = b.date

第20周第2021日历年的窗口小部件销售以及上周的工作日窗口小部件销售:

将表联接到自身上是一种非常灵活的方式,可以向数据集添加汇总列和计算列。

分组功能(例如SUM()和COUNT()与CASE()语句)的创造性使用为功能工程,分析报告和各种其他用例带来了巨大的机会。

在实践中,如果查询通过子查询加入自身,并且查询量很大,则可以预期运行时间很长。解决此问题的一种方法是使用临时表来保存具有特定问题标准的初步结果。

例如,在SAS的WORK库中为整个时间范围创建一个小部件销售表,并多次查询该表。高效的代码结构(例如使用索引)也可以提高效率。

三、使用CASE语句处理复杂的逻辑

CASE语句的语法与整个数据科学中其他常用编程语言的逻辑不同(请参阅:Python / R)。

通过使用伪代码对逻辑规则进行周到的设计可以帮助避免由于不正确/不一致的规则而导致的错误。了解如何在SQL中编码嵌套逻辑对于释放数据中的潜力至关重要。

假设有一张购物者表,其中包含给定时间范围内的年龄,家庭状态和销售情况等大量特征。有针对性的营销活动正用于尝试提高普通购物者的销售额(Marketing已将平均购物者确定为消费在 100- 200之间的人)。

一旦被识别,Z世代/千禧一代购物者将获得数字优惠券,所有其他购物者将被邮寄一张印刷优惠券,该打印优惠券将根据他们所居住的州而有所不同。为简单起见,只有三个州的购物者居住。

这是在R和SQL中如何编码此逻辑的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## Example of Nested Logic in R
if(shoppers$sales<=0){ print("Error: Negative/No Sales")}
else if(shoppers&sales<=100){ print("Shopper has below-average sales.")}
else if(shoppers&sales<=200){ 
   if(shopper$age<41){print("Shopper has average sales and is Gen Z/Millennial.")}
   else{
 if(shopper$state=='NJ'){print("Shopper has average sales, is Gen X/Boomer/Greatest Gen., and lives in New Jersey.")}
 else if(shopper$state=='NY'){print("Shopper has average sales, is Gen X/Boomer/Greatest Gen., and lives in New York.")
 else(shopper$state=='CT'){print("Shopper has average sales, is Gen X/Boomer/Greatest Gen., and lives in Connecticut.")}
   }
}
else{print("Shopper has above-average sales.")}

*Example of nested logic in SQL. No need to actually nest statements!;
, case when sales < 0
 then 'Error: Negative/No Sales.'
when sales <=100
 then 'Shopper has below-average sales.'
when sales <=200 and age <41
 then 'Shopper has average sales and is Gen Z/Millennial.'
when sales <=200 and state = 'NJ'

 then 'Shopper has average sales, is Gen X/Boomer/Greatest Gen., and lives in New Jersey.'
when sales <=200 and state = 'NY'
 then 'Shopper has average sales, is Gen X/Boomer/Greatest Gen., and lives in New York.'
when sales <=200 and state = 'CT'
 then 'Shopper has average sales, is Gen X/Boomer/Greatest Gen., and lives in Connecticut.'
else 'Shopper has above-average sales.'
end as shopper_classification

周到地使用CASE语句将使您能够构建复杂业务逻辑的任何组合。

但是,SQL逻辑与其他编程语言所需要的思维方式略有不同。

结合分组功能,这些工具可以为数据科学家提供竞争优势,以获取和转换用于特征工程,商业智能,分析报告等的数据源!

文丨Soundhearer

图丨来源于网络

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云原生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
从1到10 的高级 SQL 技巧,试试知道多少?
以正确的方式有效更新表很重要。理想的情况是当您的事务是主键、唯一整数和自动增量时。这种情况下的表更新很简单:
万能数据的小草
2024/07/23
830
从1到10 的高级 SQL 技巧,试试知道多少?
Greenplum 实时数据仓库实践(8)——事实表技术
上一篇里介绍了几种基本的维度表技术,并用示例演示了每种技术的实现过程。本篇说明多维数据仓库中常见的事实表技术。我们将讲述五种基本事实表扩展技术,分别是周期快照、累积快照、无事实的事实表、迟到的事实和累积度量。和讨论维度表一样,也会从概念开始认识这些技术,继而给出常见的使用场景,最后以销售订单数据仓库为例,给出实现代码和测试过程。
用户1148526
2022/04/13
1.7K0
Greenplum 实时数据仓库实践(8)——事实表技术
基于hadoop生态圈的数据仓库实践 —— OLAP与数据可视化(三)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/52314152
用户1148526
2019/05/25
8330
最强总结!SQL Server/MySQL/Oracle函数完全指南!!
今天给大家总结的是SQL Server/MySQL/Oracle这三个关系数据库的函数内容,包含常用和不常用的。
SQL数据库开发
2024/11/13
2480
最强总结!SQL Server/MySQL/Oracle函数完全指南!!
「SQL面试题库」 No_102 按年度列出销售总额
题目介绍: 按年度列出销售总额 total-sales-amount-by-year
不吃西红柿
2023/10/16
2320
10 个高级的 SQL 查询技巧
如果您想要查询子查询,那就是CTEs施展身手的时候 - CTEs基本上创建了一个临时表。
民工哥
2024/03/12
2010
10 个高级的 SQL 查询技巧
深入SQL执行计划之CBO查询转换(5):星型转换(Star Transformation)
本文作者系Scott(中文名陈晓辉),现任大连华信资深分析师 ,ORACLE数据库专家,曾就职于甲骨文中国。个人主页:segmentfault.com/u/db_perf ,经其本人授权发布。
SQLplusDB
2022/08/19
3330
深入SQL执行计划之CBO查询转换(5):星型转换(Star Transformation)
LeetCode MySQL 1384. 按年度列出销售总额
编写一段SQL查询每个产品每年的总销售额,并包含 product_id, product_name 以及 report_year 等信息。
Michael阿明
2021/02/19
4570
常见大数据面试SQL-查询每个产品每年总销售额
已知有表如下,记录了每个产品id、产品名称、产品销售开始日期、产品销售结束日期以及产品日均销售金额,请计算出每个产品每年的销售金额
数据仓库晨曦
2024/06/28
1860
常见大数据面试SQL-查询每个产品每年总销售额
面试现场!月薪3w+的这些数据挖掘SQL面试题你都掌握了吗? ⛵
图片💡 作者:韩信子@ShowMeAI📘 数据分析实战系列:https://www.showmeai.tech/tutorials/40📘 AI 面试题库系列:https://www.showmeai.tech/tutorials/48📘 本文地址:https://www.showmeai.tech/article-detail/318📢 声明:版权所有,转载请联系平台与作者并注明出处📢 收藏ShowMeAI查看更多精彩内容图片本篇内容基于场景面试题完成,在给定场景和数据表的前提下,有一系列的分析挖掘问题,
ShowMeAI
2022/08/26
5530
面试现场!月薪3w+的这些数据挖掘SQL面试题你都掌握了吗? ⛵
HAWQ取代传统数仓实践(十六)——事实表技术之迟到的事实
一、迟到的事实简介         数据仓库通常建立于一种理想的假设情况下,这就是数据仓库的度量(事实记录)与度量的环境(维度记录)同时出现在数据仓库中。当同时拥有事实记录和正确的当前维度行时,就能够
用户1148526
2018/01/03
1.4K0
HAWQ取代传统数仓实践(十六)——事实表技术之迟到的事实
面试的时候被面试官一道SQL题给难住了
查找每个作者销售总额最高的书籍的标题、作者和销售总额。如果有多个书籍销售总额相同且最高,则只需返回其中一个。
小白的大数据之旅
2024/11/20
510
「SQL面试题库」 No_114 周内每天的销售情况
``` Orders 表: +------------+--------------+-------------+--------------+-------------+ | order_id | customer_id | order_date | item_id | quantity | +------------+--------------+-------------+--------------+-------------+ | 1 | 1 | 2020-06-01 | 1 | 10 | | 2 | 1 | 2020-06-08 | 2 | 10 | | 3 | 2 | 2020-06-02 | 1 | 5 | | 4 | 3 | 2020-06-03 | 3 | 5 | | 5 | 4 | 2020-06-04 | 4 | 1 | | 6 | 4 | 2020-06-05 | 5 | 5 | | 7 | 5 | 2020-06-05 | 1 | 10 | | 8 | 5 | 2020-06-14 | 4 | 5 | | 9 | 5 | 2020-06-21 | 3 | 5 | +------------+--------------+-------------+--------------+-------------+
不吃西红柿
2023/10/16
1800
SQL ---- 语法学习笔记
SQL语法学习 基础篇 基础篇实例用表 1. Store_Information 表格 store_name Sales Date Los Angeles $1500 Jan-05-1999 San Diego $250 Jan-07-1999 Los Angeles $300 Jan-08-1999 Boston $700 Jan-09-1999 2. Geography 表格 region_name store_name East Boston East New York West Los Angel
Rattenking
2021/01/30
7700
MySQL实战面试题(附案例答案+建表语句+模拟数据+案例深度解析),练完直接碾压面试官
使用YEAR()和MONTH()函数从signup_date字段中提取年份和月份,并匹配给定的条件。
小白的大数据之旅
2024/11/20
1440
GBase 数据库在分布式查询中的优化与实现
随着大数据技术的快速发展,传统的单机数据库已难以满足海量数据存储与查询的需求。在这样的背景下,分布式数据库成为主流,GBase 系列数据库(如 GBase8a、GBase8s 和 GBase8c)以其卓越的性能和灵活性,成为企业选择分布式数据库解决方案的首选之一。
用户11381600
2024/12/03
900
浅谈 T-SQL高级查询
之前我们简单的了解了增、删、改、查这几类T-SQL语法来操纵数据表,但是为了更方便快捷地完成大量任务,SQL Server 提供了一些内部函数,可以和SQL Server 的SELECT语句来联合使用,进行类型转换、日期处理、数学计算、实现系统功能。
小手冰凉
2019/09/10
1.7K0
浅谈 T-SQL高级查询
SQL学习笔记之SQL查询练习1
–1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name,t_id) – –课程编号, 课程名称, 教师编号 –3.教师表 Teacher(t_id,t_name) –教师编号,教师姓名 –4.成绩表 Score(s_id,c_id,s_score) –学生编号,课程编号,分数
Jetpropelledsnake21
2018/08/01
6100
C# .NET面试系列十一:数据库SQL查询(附建表语句)
一个叫 team 的表,里面只有一个字段name, 一共有4 条纪录,分别是a,b,c,d, 对应四个球队,现在四个球对进行比赛,用一条sql 语句显示所有可能的比赛组合
GoodTime
2024/03/12
1490
C# .NET面试系列十一:数据库SQL查询(附建表语句)
如何避免Spark SQL做数据导入时产生大量小文件
我们之前的文章《蚂蚁绊倒大象...》介绍过,海量小文件是大数据领域中公认的难题,对时间和性能都可能造成毁灭性打击。本文将继续针对小文件,讲解小文件产生的原因和一些解决办法,希望对大家能有所启发。
大数据老哥
2021/03/24
3.6K0
如何避免Spark SQL做数据导入时产生大量小文件
推荐阅读
相关推荐
从1到10 的高级 SQL 技巧,试试知道多少?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验