SQL进阶技巧:如何利用if语句简化where或join中的条件 | if条件语句的优雅使用方法

目录

0 问题场景

1 数据准备

2 问题分析

2.1 需求一

2.2需求二

3 小结

想要进一步了解SQL这门艺术语言的,可以订阅我的专栏数字化建设通关指南,将在该专栏进行详细解析。

专栏 原价99,现在活动价39.9,按照阶梯式增长,还差3个名额将上升至59.9,直到恢复原价。

数字化建设通关指南


0 问题场景

有两张表,一张用户下单表user_purchase(用户ID粒度)包含用户ID、订单ID和下单消耗金额和一张用户维表user_info包含用户ID、用户年龄和用户是否实名认证。

user_purchase

user_info

需求一

  • 我想取出所有认证过的用户,如果用户没有认证过,就取出年龄大于18岁的用户

需求二

  • 在user_purchase的基础上加上用户年龄字段,但是user_purchase中存在用户ID大量为null的情况,和user_info关联的话会产生数据倾斜,需要做一下倾斜处理

1 数据准备

create table user_purchase as 
(select stack(4,1001,1,20,1002,2,10,1003,3,40,null,4,40) as(user_id,order_id,amount));

create table user_info as 
(select stack(3,1001,25,1,1002,30,1,1003,18,0) as(user_id,age,is_certified));

2 问题分析

2.1 需求一

  • 一般写法:可以按照是否认证过分成两个条件用或逻辑取出想要的数据

select*
from user_info
where is_certified=1 or (is_certified=0 and age > 18)
  •  优雅写法

使用if函数:如果认证过所有数据记录都是满足条件的,如果没有认证过要继续判断一下年龄是否满足大于18岁。这种写法更加易读简洁

selectuser_id,age,is_certified
from user_info
where if(is_certified=1, 1=1, age > 18) 

2.2需求二

  • 一般写法:在关联之前提前处理user_purchase中的user_id的null

selecta.user_id,a.order_id,a.amount,b.age
from(selectif(user_id is null, concat('user_', FLOOR(100 * RAND())), user_id) as user_id_process,user_id,order_id,amountfrom user_purchase) a
left join(selectuser_id,age,is_certifiedfrom user_info) b on a.user_id_process=b.user_id
  • 优雅写法 

使用if函数:在关联的时候对user_purchase中为null的user_id做处理

selecta.user_id,a.order_id,a.amount,b.age
from(selectuser_id,order_id,amountfrom user_purchase) a
left join(selectuser_id,age,is_certifiedfrom user_info) b on if(a.user_id is null, concat('user_', FLOOR(100 * RAND())), a.user_id)=b.user_id

3 小结

数仓开发中if函数是最最常用的函数之一,我们一般都是在select之后或者聚合函数中高频使用,在其他关键字后面使用较少。特定场景在where和join条件中使用if函数,还是相当优雅的

想要进一步了解SQL这门艺术语言的,可以订阅我的专栏数字化建设通关指南,将在该专栏进行详细解析。

专栏 原价99,现在活动价39.9,按照阶梯式增长,还差3个名额将上升至59.9,直到恢复原价。
 

数字化建设通关指南

主要内容:


(1)SQL进阶实战技巧

可以参考如下教程,具体链接如下

SQL很简单,可你却写不好?也许这才是SQL最好的教程


 

上面链接中的文章及技巧会不定期更新。

(2)数仓建模实战技巧和个人心得

       1)新人入职新公司后应如何快速了解业务?

       2)以业务视角看宽表化建设?

       3)  维度建模 or 关系型建模?

       4)业务模型与数据模型有什么区别?业务阶段的模型该如何建设?

       5)业务指标体系该如何建设?指标体系该如何维护?指标平台应如何建设?指标体系                           该由谁来搭建?

       6)如何优雅设计DWS层?DWS层模型好坏该如何评价?

       7)指标发生异常,该如何排查?应从哪些方面入手寻找问题点?

       8) 数据架构的选择,mpp or hadoop?

       9)数仓团队应如何体现自己的业务价值,讲好数据故事?

       10)BI与大数据有什么关系?BI与信息化、数字化之间有什么关系?BI与报表之间的关                          系?

       11)数据部门如何与业务部门沟通,并规划指引业务需求?

文章不限于以上内容,有新的想法也会及时更新到该专栏。

具体专栏链接如下:

数字化建设通关指南_莫叫石榴姐的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148744.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

SQL语法学习与实战应用

第一章 引言 1.1 MySQL数据库概述 MySQL,作为一种广泛使用的关系型数据库管理系统,自其问世以来,便凭借开源、高性能及低成本等显著特点,迅速占据了广泛的市场份额。这一系统不仅支持大规模并发访问,更提供了多样化的…

项目实战:Ingress搭建Nginx+WP论坛+MariaDB

1. 网站架构 本次部署形式完全舍弃 Docker,将所有应用都置于Kubernetes,采用 Deployment 而非单 Pod 部署,稳定性得到升级。 2. 部署 MariaDB [rootk8s-master ~]# mkdir tdr [rootk8s-master ~]# cd tdr/ (1)定义 …

【JavaEE】——线程“饿死问题” wait notify

阿华代码,不是逆风,就是我疯,你们的点赞收藏是我前进最大的动力!!希望本文内容能够帮助到你! 目录 引子: 一:情景引入 二:线程饿死问题 1:线程饿死 2&a…

lvgl学习笔记--基础对象1

【LVGL学习笔记】(三)控件使用_学习_煜个头头-GitCode 开源社区 LVGL 基础对象|极客笔记 #include "../../../lv_examples.h"void lv_ex_obj_1(void) {lv_obj_t * obj1;obj1 lv_obj_create(lv_scr_act(), NULL);lv_obj_set_size(obj1, 100, …

MySql语言操作数据库---增删改查数据库,表,数据

思维导图 SQL语言共分为四大类: 数据定义语言DDL:数据定义语言DDL用来创建数据库中的各种对象-----[库]、[表]、[视图]、[索引]、 数据操纵语言DML:(1) 插入:INSERT (2) 更新:UPDATE (3) 删除:DELETE 数据查询语言DQL:数据查询语…

Docker 付费订阅价格大幅上调,免费订阅功能受限,云计算和安全产品有调整

云计算de小白 同时,免费的 Docker Personal 订阅将不再包含 Build Cloud 分钟数,支持范围将从三个 Scout 存储库变为仅一个,并且仅限于一个具有 2 GB 存储空间的私有 Docker Hub 容器注册存储库。 不过,Docker也对云计算和安全产…

清华大学开源视频转文本模型——CogVLM2-Llama3-Caption

通常情况下,大多数视频数据并不附带相应的描述性文本,因此有必要将视频数据转换为文本描述,为文本到视频模型提供必要的训练数据。 CogVLM2-Caption 是一个视频字幕模型,用于为 CogVideoX 模型生成训练数据。 文件 使用 import i…

C语言编程中的小数(double,float)

最近看电路基础,第一个知识就是欧姆定律。 一、欧姆本人介绍 欧姆(Georg Simon Ohm)‌,1789年3月16日出生于德国巴伐利亚州的‌埃尔朗根,是一位杰出的物理学家和数学家。他最为人知的是在‌电学领域的贡献&#xff0…

动态倒计时在 Vue 3 中的实现

目录 1. Demo2. 实战Demo3. 拓展Demo 1. Demo 给一版初始的Demo,在给一版实战中的Demo 基本知识点: Vue 3 的响应式原理:Vue 3 使用 reactive 和 ref 创建响应式数据,数据的变化会自动触发视图更新setup 函数:Vue 3…

​智慧铜矿厂综合管控平台,智慧矿山数字孪生

随着矿山行业的不断发展,传统的管理方式已经无法满足现代铜矿高效、安全、环保和精细化管理的需求,因此,构建一个综合管控平台变得尤为必要。HT 铜矿综合管控平台应运而生,通过信息化和智能化手段,整合采矿、选矿、冶炼…

【包教包会】CocosCreator3.x框架——音频模块(无需导入、无需常驻节点)

下载地址:AudioDemo3.x: CocosCreator3.x框架——音频模块 注意事项: 1、gi.musicPlay、gi.soundPlay是同步函数,使用前必须先将音频加载到缓存 Demo通过SceneLoading实现了一个极简的Loading页面,将音频全部加载后进入游戏&…

Vue学习文档

文章目录 一、Vue 简介1、官网2、作者和版本3、定义4、特点5、Vue 的周边库二、Vue 安装使用1、CDN 引入2、下载后引入3、命令行工具 (CLI)三、入门案例四、MVVM模型1、MVVM 模型2、Vue 与 MVVM 模型五、Vue 基本使用1、文本插值(掌握)-text2、属性插值(掌握 )-bind3、Clas…

【Python】Spyder:科学 Python 开发环境

在数据科学和科学计算领域,Python 已经成为了一个不可或缺的工具。为了提高开发效率和改善编程体验,一个功能强大且用户友好的开发环境是必需的。Spyder(Scientific Python Development Environment)正是这样一个为科学计算和数据…

数据结构-线性表的单链式存储结构图解及C语言实现

概念 链式存储:结点在存储器中的位置是任意的,即逻辑相邻的数据元素在物理上不一定相邻 链式存储结构也称非顺序映像或链式映像 图解 链式存储结构中结点一般有两个部分组成,即数据域(data)和指针域,数据域是用于存放数据的&…

振弦式轴力计 轴向力仪器钢支撑轴力计 清易让选择不再迷路

产品概述 振弦式轴力计是一种用于测量轴向力的仪器。它通过测量振弦的频率变化来计算轴向力的大小。当轴向力作用在弹性元件上时,振弦的张力会发生变化,从而导致振弦的频率发生变化。电磁线圈用于驱动振弦并测量其频率。信号处理单元则用于将频率信号转…

Anthropic谋求新一轮融资 估值或达400亿美元

🦉 AI新闻 🚀 Anthropic谋求新一轮融资 估值或达400亿美元 摘要:美国AI初创公司Anthropic正在与投资者洽谈新一轮融资,估值可能达到300至400亿美元,约为今年初融资估值的两倍。Anthropic依靠其生成式AI聊天机器人Cla…

LNK2019:无法解析的外部符号 “class std::basic_ostream ...(template 的声明)

文章目录 一、问题&#xff1a;二、解决&#xff1a;1. 问题2. 解释① 类模板② 函数模板 一、问题&#xff1a; 今天在实现 vector 时&#xff0c;发现出现了一个错误&#xff1a; 它说&#xff0c;不认识 ostream&#xff0c;我在重载<< 符号时&#xff0c;使用了 ost…

7.ChatGPT与SEO - 优化内容策略【7/10】

引言 在当今的数字化时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已成为数字营销中不可或缺的一部分。它不仅帮助企业提高在线可见性&#xff0c;还直接影响着网站的流量、品牌知名度和最终的销售转化。SEO通过优化网站内容和结构&#xff0c;使其在搜索引擎结果…

【Python】多个dataframe存入excel的不同的sheet表里,而不会被覆盖的方法

我发现&#xff0c;我原来用的多个工作簿存入的方法&#xff0c;发现不太可行了。当使用for循环的时候&#xff0c;原来的sheet 会被新的表给覆盖&#xff0c;后来我找到一种新的方法&#xff1a; with pd.ExcelWriter(file_name ) as writer:Table.to_excel(writer, sheet_na…

JAVA无缝沟通全球国际版多语言语聊系统小程序源码

无缝沟通全球 —— 国际版多语言语聊系统 &#x1f30d;【开篇&#xff1a;跨越语言障碍&#xff0c;与世界无缝对话】&#x1f30d; 在这个全球化的时代&#xff0c;你是否渴望与世界各地的朋友无缝交流&#xff0c;却常常被语言的隔阂所困扰&#xff1f;别担心&#xff0c;今…