面试数据岗必知必会——元数据与开窗函数

1. 元数据

元数据(Metadata)是指用来描述其他数据的数据,即“data about data”。它是关于数据的组织、数据域及其关系的信息,旨在提供对数据的理解和管理所需的关键背景和上下文。元数据可以帮助人们了解数据的来源、创建时间、作者、格式、质量、位置、所有权、使用权限等,从而使得数据更加易于查找、访问、使用和管理。

元数据可以分为几类:

  1. 描述性元数据(Descriptive Metadata):帮助识别和查找数据,如标题、作者、关键词和摘要等。

  2. 结构性元数据(Structural Metadata):描述数据的组成结构,如文档的章节划分或数据库的表结构。

  3. 管理性元数据(Administrative Metadata):涉及数据的管理,包括创建日期、修改日期、访问控制和版权信息等。

  4. 引用性元数据(Reference Metadata):提供指向其他相关数据的链接或引用。

  5. 统计元数据(Statistical Metadata):在数据分析领域,描述数据收集方法、质量和准确性等。

  6. 技术元数据(Technical Metadata):关于数据仓库或系统的底层技术细节,如数据结构、转换规则和数据刷新规则等。

  7. 业务元数据(Business Metadata):从商业角度描述数据,如业务术语、指标定义和业务规则等。

元数据的重要性在于它能够帮助数据使用者更有效地利用信息资源,特别是在大数据和信息管理领域,元数据是实现数据治理、数据质量管理和数据集成的基础。

2. 窗口函数(开窗函数)

2.1 概述

开窗函数(Window Functions),也称为窗口函数或者分析函数,是一种在数据库查询语言(如SQL)中使用的高级功能。它们允许在数据的一组行(称为窗口)上执行聚合操作,但与传统的聚合函数(如SUM, AVG, COUNT等)不同的是,开窗函数可以在结果集中为每一行返回一个值,而不是仅仅返回一个聚合后的单值。

开窗函数在处理需要上下文信息或跨行计算的复杂查询时特别有用,例如计算连续排名、移动平均、累计总和等。它们可以被看作是在查询结果的每一行上应用的局部聚合。

窗口函数的基本语法如下:

<function>([expression]) OVER (
    [PARTITION BY <partition_expression>]
    [ORDER BY <order_expression>]
    [ROWS|RANGE <frame_clause>]
)

其中function_name可以是各种聚合函数,如SUM, COUNT, AVG, MIN, MAX等,也可以是特定的窗口函数,如ROW_NUMBER(), RANK(), DENSE_RANK(), LAG(), LEAD()等。

over后面制定了窗口的范围,通常包括以下三个部分:

  1. PARTITION BY:将结果集分割成不同的分区或组,每个组独立进行计算。
  2. ORDER BY:在每个分区内对行进行排序。
  3. ROWS BETWEENRANGE BETWEEN:定义窗口的范围,可以是固定的行数或基于排序键值的范围。

例如,如果有一个销售记录表,你可能想计算每个产品的累计销售额,这时你可以使用类似如下的SQL语句:

SELECT product_id, sale_date, amount,
       SUM(amount) OVER (PARTITION BY product_id ORDER BY sale_date) AS cumulative_sales
FROM sales;

在这个例子中,SUM(amount) OVER ...就是一个开窗函数,它计算了每个产品随时间的累计销售额。

开窗函数在现代的SQL数据库系统中广泛支持,如PostgreSQL, MySQL 8.0+, Oracle, SQL Server等。

2.2 分类

窗口函数可以大致分为以下几类:

  1. 排名函数

    • ROW_NUMBER():为每个行分配一个唯一的整数。
    • RANK():根据指定的排序规则为行分配排名,跳过因重复值产生的排名。
    • DENSE_RANK():类似于RANK,但是不会跳过排名。
    • PERCENT_RANK():计算行在其分区中的相对排名。
  2. 偏移函数

    • LAG():访问当前行前的行的值。
    • LEAD():访问当前行后的行的值。
  3. 框架函数

    • FIRST_VALUE():返回给定表达式在窗口中的第一个值。
    • LAST_VALUE():返回给定表达式在窗口中的最后一个值。
  4. 聚集函数

    • SUM(), AVG(), MIN(), MAX(), COUNT()等,这些函数在窗口函数中使用时,会对窗口内的行进行聚合。

窗口函数在现代的数据库系统中得到了广泛的支持,包括PostgreSQL, MySQL 8.0+, Oracle, SQL Server等。

有些同学可能还是有些疑惑,尤其是对于PARTITION BYROWS,这是两个窗口函数中常用到的关键词,下面我再举两个例子说明

2.3 结合PARTITION BY使用

PARTITION BY是SQL中用于窗口函数的一个关键子句,它用于定义窗口函数作用的范围或者说数据的分组方式。当在窗口函数中使用PARTITION BY时,它会将数据集分割成多个独立的分区,然后在每个分区内部独立地应用窗口函数。

简单来说,PARTITION BY的作用类似于GROUP BY,但它是在窗口函数的上下文中使用,因此它不会像GROUP BY那样聚合数据并返回每个组的单个行,而是对每个分区内的数据应用窗口函数,同时保持所有原始行的结果。

例如,假设你有一个包含员工工资的表,你想要计算每个部门内所有员工的工资排名。你可以使用RANK()窗口函数结合PARTITION BY来实现这个需求:

SELECT 
    department_id, 
    employee_id, 
    salary,
    RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) as rank
FROM 
    employees;

在这个查询中,PARTITION BY department_id指定了窗口函数应该在每个部门内部独立计算排名,而ORDER BY salary DESC则确保了在每个部门内,工资最高的员工排名为1,接下来的员工按照工资递减排列。

PARTITION BY可以接受一个或多个列名作为参数,这意味着你可以根据一个或多个字段来分割数据。如果没有使用PARTITION BY,窗口函数默认会将整个结果集视为一个单独的分区。

总之,PARTITION BY是窗口函数中一个非常重要的概念,它允许你在处理数据时考虑上下文,比如在每个部门、每个地区或每个时间区间内独立地应用窗口函数,从而得到更有意义的分析结果。

2. 4 结合ROWS使用

在SQL的窗口函数中,ROWS是一个关键的概念,用于定义窗口函数计算时所考虑的行的范围。当与OVER子句一起使用时,ROWS可以指定窗口函数计算中包括的行数,这尤其在需要基于行的前后关系进行计算时非常重要,比如移动平均、累积和等。

ROWS子句通常与BETWEEN子句一起使用,以明确指出窗口的开始和结束位置。它有几种不同的用法:

  1. 固定行数:可以指定一个固定的行数作为窗口的大小。例如,ROWS BETWEEN 3 PRECEDING AND CURRENT ROW意味着当前行以及之前的3行会被包括在窗口中。

  2. 无限窗口:使用UNBOUNDED PRECEDINGUNBOUNDED FOLLOWING来表示无限向前或向后扩展的窗口。

  3. 当前行CURRENT ROW表示当前正在处理的行。

  4. 滑动窗口:通过指定PRECEDINGFOLLOWING来创建一个滑动窗口,比如ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING会在当前行前后各取两行来计算。

例如,假设你有一个交易记录表,你想要计算每笔交易前后的5个交易的平均金额,可以使用如下SQL语句:

SELECT transaction_id, transaction_amount,
       AVG(transaction_amount) OVER (
           ORDER BY transaction_time
           ROWS BETWEEN 5 PRECEDING AND 5 FOLLOWING
       ) as moving_average
FROM transactions;

在这个例子中,ROWS BETWEEN 5 PRECEDING AND 5 FOLLOWING定义了一个以当前行为中心的窗口,包括当前行前后的共11个交易(5前+5后+当前行),并计算这个窗口内交易金额的平均值。

ROWS子句的灵活性使得窗口函数能够处理各种复杂的分析需求,尤其是在时间序列数据和需要基于历史或未来数据点进行计算的场景中。


点赞关注收藏,获取更多干货知识~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数学建模论文写作文档word

目录 1. 摘要写法1.1 确定题目与方法1.2 编写开头段落1.3 填写问题一1.4 重复步骤3填写其他问题1.5 编写结尾段落1.6 编写关键词 2. 问题重述2.1 问题背景2.2 问题提出 3. 问题分析4. 问题X模型的建立与求解5. 模型的分析5.1 灵敏度分析5.2 误差分析&#xff08;主要用于预测类…

linux基础—目录和文件操作

1&#xff0c;列出目录和文件的详细信息 ls: ls -l ls -lt 2&#xff0c;认识文件 第一列 左边的一组排序中&#xff0c;第一个字符是文件的类型&#xff0c;后面9个字符是文件的权限。 第一个字符主要有3种情况&#xff1a; d表示目录、-表示文件&#xff0c;l表示链接 第…

【回溯算法经典题目解析】

1. 什么是回溯算法 回溯算法是⼀种经典的递归算法&#xff0c;通常用于解决组合问题、排列问题和搜索问题等。 回溯算法的基本思想&#xff1a;从一个初始状态开始&#xff0c;按照⼀定的规则向前搜索&#xff0c;当搜索到某个状态⽆法前进时&#xff0c;回退到前⼀个状态&am…

背包问题转换

如何转换成背包问题呢&#xff0c;我们可以把每个质数当成一个重量 #define _CRT_SECURE_NO_WARNINGS #include<bits/stdc.h> using namespace std;#define int long long int record[1005]; void fun() {//record[2] 1;for (int i 2; i < 1000; i) {if (!record[…

JDBC和数据库连接池

1 JDBC概述 1.1 数据持久化 持久化(persistence)&#xff1a;把数据保存到可掉电式存储设备中以供之后使用。大多数情况下&#xff0c;特别是企业级应用&#xff0c;数据持久化意味着将内存中的数据保存到硬盘上加以”固化”&#xff0c;而持久化的实现过程大多通过各种关系数…

鸿蒙语言基础类库:【@ohos.url (URL字符串解析)】

URL字符串解析 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 导入…

第一百四十九节 Java数据类型教程 - Java子字符串、字符串转换

Java数据类型教程 - Java子字符串 获取子字符串 我们可以使用substring()方法来获取字符串的子部分。 我们可以将开始索引作为参数&#xff0c;并返回一个从开始索引开始到字符串结尾的子串。 我们还可以将开始索引和结束索引作为参数。 它返回从开始索引开始的子字符串和小…

使用预加载库优化 PostgreSQL 函数#postgresql认证

在 POSTGRESQL 中执行函数和过程 为了理解 PostgreSQL 的工作原理&#xff0c;我们首先要看一个简单的函数调用。下一个清单显示了一些简单的PostGIS代码&#xff1a; PgSQL test# timing Timing is on. test# SELECT * FROM hans.points WHERE id 1;id │ …

【工具分享】零零信安攻击面管理平台

文章目录 00SEC-ASM™功能介绍功能演示 最近闲来无事&#xff0c;到处网上冲浪&#xff0c;无意间发现了长亭云图攻击面管理平台&#xff0c;无奈需要授权才能使用&#xff0c;于是就找到了平替&#xff1a;零零信安攻击面管理平台。 长亭云图攻击面管理平台&#xff1a;https:…

代码随想录-Day50

1143. 最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些…

Kotlin linkedMapOf filterKeys

Kotlin linkedMapOf filterKeys fun main(args: Array<String>) {val lhm linkedMapOf<String, Any>(Pair("name", "phil"), //因为key相同都为 name&#xff0c;被后面的覆盖。Pair("year", 2024),Pair("name", "f…

【TB作品】51单片机 Proteus仿真 00013红外proteus仿真循迹避障小车

实验报告&#xff1a;智能小车系统设计与实现 一、背景介绍 本实验旨在设计并实现一个基于STC89C52单片机控制的智能小车系统。该系统通过超声波传感器进行避障&#xff0c;通过红外接收器实现远程控制&#xff0c;同时具备循迹功能。整个系统的核心是单片机&#xff0c;它通…

初识c++(命名空间,缺省参数,函数重载)

一、命名空间 1、namespace的意义 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存在于全 局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化&#xff0c;以避免命名 冲突…

python对象

类 我们目前所学习的对象都是Python内置的对象但是内置对象并不能满足所有的需求&#xff0c;所以我们在开发中经常需要自定义一些对象类&#xff0c;简单理解它就相当于一个图纸。在程序中我们需要根据类来创建对象类就是对象的图纸&#xff01;我们也称对象是类的实例&#…

caeses软件许可优化解决方案

Caeses软件介绍 CAESES是一款十分很不错的三维建模仿真的软件。它功能很大、优化效率高、可以自动化优化、分析工具快速 CAESES拥有多种不同的试验设计及单目标、多目标优化算法&#xff0c;能够根据仿真计算评估的结果。软件可以帮助用户轻松的打造出自各种船舶、汽车、航空航…

grafana数据展示

目录 一、安装步骤 二、如何添加喜欢的界面 三、自动添加注册客户端主机 一、安装步骤 启动成功后 可以查看端口3000是否启动 如果启动了就在浏览器输入IP地址&#xff1a;3000 账号密码默认是admin 然后点击 log in 第一次会让你修改密码 根据自定义密码然后就能登录到界面…

1-3分钟爆款视频素材在哪找啊?这9个热门爆款素材网站分享给你

在如今快节奏的时代&#xff0c;短视频已成为吸引观众注意力的黄金手段。然而&#xff0c;要制作出1-3分钟的爆款视频&#xff0c;除了创意和剪辑技巧外&#xff0c;选择合适的素材至关重要。那么&#xff0c;哪里可以找到那些能让你的视频脱颖而出的爆款素材呢&#xff1f;不用…

顶会FAST24最佳论文|阿里云块存储架构演进的得与失-1.引言

今年早些时候&#xff0c;2月份举办的全球计算机存储顶会USENIX FAST 2024&#xff0c;最佳论文来自阿里云&#xff0c;论文名称《What’s the Story in EBS Glory: Evolutions and Lessons in Building Cloud Block Store》 &#xff0c;论文详尽地探讨了阿里云在过去十年中开…

ASAN排查程序中内存问题使用总结

简介 谷歌有一系列Sanitizer工具&#xff0c;可用于排查程序中内存相关的问题。常用的Sanitizer工具包括&#xff1a; Address Sanitizer&#xff08;ASan&#xff09;&#xff1a;用于检测内存使用错误。Leak Sanitizer&#xff08;LSan&#xff09;&#xff1a;用于检测内存…

YOLOv9:一个关注信息丢失问题的目标检测

本文来自公众号“AI大道理” 当前的深度学习方法关注的是如何设计最合适的目标函数&#xff0c;使模型的预测结果最接近地面的真实情况。同时&#xff0c;必须设计一个适当的体系结构&#xff0c;以方便获取足够的预测信息。 现有方法忽略了一个事实&#xff0c;即输入数据在逐…