SQL进阶技巧:如何使数组中的固定参数动态化? | SQL中的滑动窗口如何实现?

news2024/10/19 15:00:41

目录

0 场景描述

1 数据准备

2 实现思路 

问题2:如何动态获取年份,年份能够自动更新?

3 小结

如果觉得本文对你有帮助,想进一步学习SQL语言这门艺术的,那么不妨也可以选择去看看我的博客专栏 ,部分内容如下:

数字化建设通关指南

专栏 原价99,现在活动价59.9,按照阶梯式增长,直到恢复原价。


0 场景描述

在表中有一堆学生记录。

school  stduent_id   start_date    end_date
222      123         2019-02-03   2023-02-03
222      345         2015-02-03   2019-02-03
222      567         2021-02-03   2024-02-03

(1)我想计算每所学校每年有多少学生,比如从 2​​017 年一直到 2024 年。

(2) 我希望在年份移动时自动更新,例如,现在应该是 2017-2024,明年应该是 2018-2025。

1 数据准备

create table student as
(
select stack(
3,
222 ,     123,         '2019-02-03',   '2023-02-03',
222 ,     345,         '2015-02-03',   '2019-02-03',
222 ,     567,         '2021-02-03',   '2024-02-03'
) as(school,student,start_date,end_date)
);

2 实现思路 

问题1分析

第一步:利用lateral view explode展成明细数据

SELECT *
FROM student
         LATERAL VIEW EXPLODE(ARRAY(2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024)) a AS yrs
;
222	123	2019-02-03	2023-02-03	2017
222	123	2019-02-03	2023-02-03	2018
222	123	2019-02-03	2023-02-03	2019
222	123	2019-02-03	2023-02-03	2020
222	123	2019-02-03	2023-02-03	2021
222	123	2019-02-03	2023-02-03	2022
222	123	2019-02-03	2023-02-03	2023
222	123	2019-02-03	2023-02-03	2024
222	345	2015-02-03	2019-02-03	2017
222	345	2015-02-03	2019-02-03	2018
222	345	2015-02-03	2019-02-03	2019
222	345	2015-02-03	2019-02-03	2020
222	345	2015-02-03	2019-02-03	2021
222	345	2015-02-03	2019-02-03	2022
222	345	2015-02-03	2019-02-03	2023
222	345	2015-02-03	2019-02-03	2024
222	567	2021-02-03	2024-02-03	2017
222	567	2021-02-03	2024-02-03	2018
222	567	2021-02-03	2024-02-03	2019
222	567	2021-02-03	2024-02-03	2020
222	567	2021-02-03	2024-02-03	2021
222	567	2021-02-03	2024-02-03	2022
222	567	2021-02-03	2024-02-03	2023
222	567	2021-02-03	2024-02-03	2024

(2) 按学校、年份分组,获取每年的在校生人数

SELECT school
     , yrs
     , COUNT(DISTINCT student) AS cnt
FROM student
         LATERAL VIEW EXPLODE(ARRAY(2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024)) a AS yrs
WHERE 1 = 1
  AND YEAR(start_date) <= yrs
  AND YEAR(end_date) >= yrs
group by school, yrs

问题2:如何动态获取年份,年份能够自动更新?

注意问题1的求解方式中,数组中采用固定的常数值,这种属于硬编码,实际需求当中,不可能只是固定的年份,而是随着年份的增长,年份的时间也在变动,对于这种变动的时间应该如何求解或者我应该随时间推移,依然能够保持代码的鲁棒性,而不用手动修改?

我们可以借助于posexplode函数生成序列,利用当前时间函数current_date进行范围的移动。

步骤1:利用posexplode函数生成移动指针范围(序列)

select posexplode(split(space(7),' ')) as (i,x)

 

第二步:利用当前时间进行时间上移动

7年前截止到当前时间

公式:year(current_date) - 7 + i

具体SQL如下:

select year(current_date) - 7 + i as yr
from (select posexplode(split(space(7), ' ')) as (i, x)) s

 

 最终完整的SQL如下:

SELECT school
     , year(current_date) - 7 + i  years
     , COUNT(DISTINCT student) AS cnt
FROM student
         LATERAL VIEW POSEXPLODE(SPLIT(SPACE(7), space(1))) tmp AS i, x
WHERE 1 = 1
  AND YEAR (start_date) <= year (current_date) - 7 + i
  AND YEAR (end_date) >= year (current_date) - 7 + i
group by school, year (current_date) - 7 + i

3 小结

 本文依据实际场景中的案例,分析了SQL中如何使数组中的固定参数动态化的解决方案。根据本文中的案例可进一步抽象为特定条件下的滑动窗口的实现,如本文按照条件生成窗口范围为7,移动步长为1,注意此处需要与窗口函数中order by后的滑动窗口的区别。

如果觉得本文对你有帮助,想进一步学习SQL语言这门艺术的,那么不妨也可以选择去看看我的博客专栏 ,部分内容如下:
数字化建设通关指南
专栏 原价99,现在活动价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.coloradmin.cn/o/2218555.html

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

相关文章

【高频SQL基础50题】46-50

SQL时刻。 目录 1.至少有5名直接下属的经理 2.确认率 3.游戏玩法分析 IV 4.部门工资前三高的所有员工 5.查找拥有有效邮箱的用户 1.至少有5名直接下属的经理 子查询。 1.先找出至少有5名直接下属的经理号managerId 2.根据经理号找到对应名字 # Write your MySQL query…

【unity小技巧】unity C#对DateTime的常见操作,用于处理日期和时间

在Unity中&#xff0c;DateTime 是一个非常有用的结构&#xff0c;用于处理日期和时间。以下是一些常见的 DateTime 操作示例&#xff1a; 1. 获取当前时间 DateTime now DateTime.Now;2. 创建特定日期和时间 DateTime specificDate new DateTime(2023, 10, 15, 14, 30, 0…

电力交易员职业标准-----达到基本入行标准(四级/中级)题库-----职业鉴定理论篇-----单选题目6~题目10-----持续更新

电力交易员职业标准-----达到基本入行标准&#xff08;四级/中级&#xff09;题库-----职业鉴定理论篇-----主目录-----持续更新https://blog.csdn.net/grd_java/article/details/143033828 2024 年电力交易员(中级工)职业鉴定理论考试题库 注意&#xff1a;每道题下面都会放相…

深度学习-机器学习与传统编程区别

在当今数字化时代&#xff0c;机器学习成为了技术领域的热门话题。本文将介绍机器学习与传统编程的不同之处&#xff0c;以及机器学习在解决复杂问题和实现智能化的巨大潜力&#xff0c;从处理方式、开发过程、驱动方式、技术要求和应用场景等5个方面进行介绍。 1、处理方式 机…

高效计算!|海鸥优化算法SOA理论与实现(Matlab/Python双语言教程)

文章来源于我的个人公众号&#xff1a;KAU的云实验台&#xff0c;主要更新智能优化算法的原理、应用、改进 MATLAB、PYTHON 海鸥是自然界中最常见的一类海鸟&#xff0c;主要以群居的生存方式遍布在各大海港、湖泊、河流地区。它们拥有较高的群集智慧&#xff0c;每到冬季&a…

冲锋衣市场洞察:全方位数据分析与趋势展望

冲锋衣整体数据分析 一. 概述 本报告基于从淘宝商品搜索接口和淘宝精确月销量接口中提取的数据&#xff0c;分析了前百个品牌在销售额上的占比情况。分析涵盖了销售额和占比的数据&#xff0c;为决策提供了依据。&#xff08;数据获取时间&#xff1a;2024.10.08&#xff09;…

数据分析方法(回归分析,决策树与神经网络,提升树,时间序列分析,假设检验,用户画像,竞品分析)等

1.回归分析 回归分析是一种统计方法&#xff0c;用于探索自变量&#xff08;预测变量&#xff09;和因变量&#xff08;目标变量&#xff09;之间的关系。它可以帮助预测变量的变化对目标变量的影响大小。例如&#xff0c;简单线性回归用于分析两个变量之间的线性关系&#xf…

快速创建一个vue项目并运行

前期准备工作: 1.安装node 2.安装npm 3.设置淘宝镜像 4.全局安装webpack 5.webpack 4.X 开始&#xff0c;需要安装 webpack-cli 依赖 6.全局安装vue-cli 正文开始: 1.创建项目 ,回车 vue init webpack vue-svg > Project name vue-demo 项目名称 回车 > Pro…

84.【C语言】数据结构之顺序表的头部插入和删除

目录 3.操作顺序表 1.分析头部插入函数 SeqList.c写入 容量检查函数 注意 main.c改为 SeqList.h添加SLPushFront的声明 运行结果 2.分析头部删除函数 SLPopFront代码 main.c改为 SeqList.h添加SLPopFront的声明 图分析 运行结果 承接83.【C语言】数据结构之顺序表…

文心一言 VS 讯飞星火 VS chatgpt (372)-- 算法导论24.4 4题

四、请将单源单目的地最短路径问题表示为一个线性规划问题。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 单源单目的地最短路径问题可以通过线性规划&#xff08;Linear Programming, LP&#xff09;进行建模。假设我们有一个加权有向图 $ G (V, E) $&#…

【LeetCode】每日一题 2024_10_14 鸡蛋掉落(记忆化搜索)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;鸡蛋掉落 代码与解题思路 今天的题目是昨天的进阶版&#xff0c;昨天给了 2 个鸡蛋&#xff0c;让我们求在一栋有 n 层楼的建筑中扔鸡蛋的最大操作次数 但是今天的题目给了 k 个鸡蛋&am…

linux 离线安装redis

1.官网下载 https://redis.io/download 或者去github下载 2.安装 Redis 解压 unzip redis-6.2.16.zip安装gcc #由于 redis 是用 C 语言开发&#xff0c;安装之前必先确认是否安装 gcc 环境&#xff08;gcc -v&#xff09; gcc -v若无安装gcc&#xff0c;参考我的文章 Lin…

kaggle中如何更新上传自定义的数据集dataset?

前言: kaggle notebook中可以上传自己的数据集进行训练&#xff0c;但是如果我们发现这个数据集有一部分需要更新下呢&#xff0c;这时候我们不必新建一个数据集&#xff0c;直接在原来的版本上进行更新即可。 以datasett的更新为例&#xff0c;在这个界面是看不到更新按钮的 …

Axure使用echarts详细教程

本次使用的axure版本为rp9,下面是效果图。 接下来是详细步骤 【步骤1】在axure上拖一个矩形进来&#xff0c;命名为myChart(这个根据实际情况来,和后面的代码对应就好) 【步骤2】 点击交互->选择加载时->选择打开链接->链接外部地址 点击fx这个符号 【步骤3】在弹…

【建筑行业】在线培训知识库与人才培养

在快速变化的建筑行业中&#xff0c;人才培养一直是企业持续发展和创新的关键。随着数字化时代的到来&#xff0c;建筑行业面临着前所未有的挑战和机遇。在线培训知识库作为一种新兴的教育工具&#xff0c;正在成为建筑行业人才培养的重要支撑。本文将深入探讨建筑行业在线培训…

Bolt 一款AI 全栈 Web 在线开发工具

参考&#xff1a; https://bolt.new/ github项目也可以支持Bolt在线打开编辑 直接连接前输入&#xff0c;比如 https://github.com/lyz1810/live2dSpeek更换成 https://bolt.new/github.com/lyz1810/live2dSpeek https://bolt.new/github.com/oh-my-live2d/oh-my-live2d 主要偏…

《OpenCV计算机视觉》——人脸检测__Haar特征、级联分类器

文章目录 Haar特征一、定义与原理二、分类三、计算方法四、应用五、优缺点 级联分类器一、定义与原理二、结构与组成三、举例说明 Haar特征 Haar特征是一种在计算机视觉和图像处理中常用的特征描述方法&#xff0c;特别适用于物体识别&#xff0c;尤其是人脸检测。以下是对Haa…

自制编程语言(一、基本的编译器)

此教程实现一个simple语言 这是一个编译型语言&#xff0c;编译成nasm simple.h #include <iostream> #include <fstream> #include <sstream> #include <string> #include <unordered_set> #include <set>void clearFileContent(const…

如在下载自己的需要的rmp包呢

下载地址&#xff1a;https://pkgs.org/和https://rpmfind.net/linux/rpm2html/search.php 根基自己的需要进行下载使用。

IRMV Lab新作:Mamba Diffusion模型实现高精度2D手部轨迹预测

作者主页&#xff1a; https://bit-mjy.github.io/ https://xieyuanli-chen.com/ 论文标题&#xff1a; MADiff: Motion-Aware Mamba Diffusion Models for Hand Trajectory Prediction on Egocentric Videos 1. 背景与挑战 在具身人工智能&#xff08;Embodied AI&#xff0…