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

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_timeROWS BETWEEN 5 PRECEDING AND 5 FOLLOWING) as moving_average
FROM transactions;

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

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


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

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

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

相关文章

【ROS中Cjson文件的作用】

在ROS (Robot Operating System) 中&#xff0c;.json 文件通常用于存储配置信息、数据序列化或者在某些情况下用于网络通信和数据交换。JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于…

数字身份管理发展趋势:​​​​​​扩展身份安全能力

身份作为企业各个应用的入口&#xff0c;大量存在于企业的内部业务和外部业务中&#xff0c;身份作为最核心数据对于企业的重要性不言而喻&#xff0c;因此也往往成为攻击者的攻击目标&#xff0c;从2023年国资国企受攻击的情况也不难看出&#xff0c;针对身份的攻击累计超过37…

【代码随想录_Day27】509 斐波那契数 70 爬楼梯 746 使用最小花费爬楼梯

Day27 OK&#xff0c;今日份的打卡&#xff01;第二十七天 以下是今日份的总结斐波那契数爬楼梯使用最小花费爬楼梯 以下是今日份的总结 509 斐波那契数 70 爬楼梯 746 使用最小花费爬楼梯 今天的题目难度不高&#xff0c;掌握技巧了就会很简单&#xff0c;尽量还是写一些简洁…

白嫖A100活动来啦,书生·浦语大模型全链路开源体系

扫码参加即可获得&#xff1a; 第一节 书生浦语大模型全链路开源体系 书生浦语大模型的开源历程。 从模型到应用的典型流程 书生浦语的开源体系&#xff0c;包含从数据、预训练、微调、部署、评测、应用等环节

CC4利用链分析

我的Github主页Java反序列化学习同步更新&#xff0c;有简单的利用链图 分析版本 Commons Collections 4.0 JDK 8u65 环境配置参考JAVA安全初探(三):CC1链全分析 分析过程 在Commons Collections 4.0中&#xff0c;TransformingComparator类变为可序列化类&#xff0c;增…

Java学习高级二

Java是单继承的 Object类 方法重写 Java子类访问 – 就近原则 子类构造器的特点 多态 Java–final

机器学习之模型训练

前言 模型训练一般分为四个步骤&#xff1a; 构建数据集。定义神经网络模型。定义超参、损失函数及优化器。输入数据集进行训练与评估。 有了数据集和模型后&#xff0c;可以进行模型的训练与评估。 构建数据集 定义神经网络模型 class Network(nn.Cell):def __init__(sel…

WPF更新UI线程实现进度条功能

WPF更新UI线程实现进度条功能 我的写法 <Page x:Class"CableInspectionScreen.ConfigPage"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc"http:/…

AtCoder Beginner Contest 360

A - A Healthy Breakfast 枚举一下&#xff0c;只要R在M之前就行了 #include <iostream>using namespace std;int main() {char a,b,c;cin >> a >> b >> c;if((a R && (b M || c M)) || (b R && c M)){cout << "Yes…

OpenSNN推文:个人博客站点文章汇总:大模索型时代,ESM-AA,Victoria Metrics

产学研专家共论道&#xff01;探大模索型时代数据要素流通突围之道&#xff0c;「隐语城市行开源两周年特别活动」报名开启 2024年7月3日 segmentfault思否 简介&#xff1a;随着 “数据二十条”等引导或规范数据要素流通的政策文件落地&#xff0c;包含隐私计算、AI 大模型…

论文阅读:A Survey on Evaluation of Large Language Models

A Survey on Evaluation of Large Language Models 这篇论文是由Yupeng Chang等人撰写的关于大型语言模型&#xff08;LLMs&#xff09;评估的综述&#xff0c;题为《A Survey on Evaluation of Large Language Models》。 摘要 大型语言模型&#xff08;LLMs&#xff09;在…

【trition-server】运行一个pytorch的ngc镜像

ngc 提供了pytorch容器 号称是做了gpu加速的 我装的系统版本是3.8的python,但是pytorch似乎是用conda安装的3.5的: torch的python库是ls支持gpu加速是真的 英伟达的pytorch的说明书 root@a79bc3874b9d:/opt/pytorch# cat NVREADME.md PyTorch ======= PyTorch is a python …

为什么gpt模型输入的token最大数量被限制在几万,是有技术问题吗?

既是技术问题&#xff0c;也是算力问题。 算力问题很容易理解&#xff0c;GPT4大概率还是用Transformer模型。Transformer如果经过各种Linear技术的优化&#xff08;如Sparse&#xff09;&#xff0c;那么Scaling Law难以保证&#xff1b;如果保持原样&#xff0c;那么复杂度是…

深入理解Java中的Lambda表达式与函数式接口

深入理解Java中的Lambda表达式与函数式接口 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. Lambda表达式的基础 Lambda表达式是Java 8引入的一个重要特性&#xff0c;它使得Java的函数式编程更…

vivado DIFF_TERM_ADV

DIFF_TERM_ADV 高级差分终止&#xff08;DIFF_TERM_ADV&#xff09;属性用于 UltraScale体系结构&#xff0c;用于启用或禁用内置的100Ω差分 用于输入或双向端口的端接。DIFF_TERM_ADV表示差 应在差分输入和双向端口缓冲器上使用终止方法&#xff0c;以及 Vivado Design Suite…

嵌入式C语言面试相关知识——CPU、进程和线程相关(相关问题很多,会经常过来更新)

嵌入式C语言面试相关知识——CPU、进程和线程相关 一、博客声明二、自问题目——CPU相关1、什么是中断&#xff1f;如何处理中断&#xff1f;2、解释上下文切换(Context Switch)&#xff1f;3、在嵌入式中如何优化CPU使用&#xff1f; 三、自问题目——进程相关1、什么是进程&a…

顶会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;论文详尽地探讨了阿里云在过去十年中开…

EtherCAT主站IGH-- 10 -- IGH之ethernet.h/c文件解析

EtherCAT主站IGH-- 10 -- IGH之ethernet.h/c文件解析 0 预览一 该文件功能`eoe.c` 文件功能函数预览二 函数功能介绍1. `ec_eoe_init`2. `ec_eoe_clear`3. `ec_eoe_send`4. `ec_eoe_run`5. `ec_eoe_queue`6. `ec_eoe_is_open`7. `ec_eoe_is_idle`8. `ec_eoe_name`示例用法示例详…

HTML(28)——空间转换

空间&#xff1a;是从坐标轴角度定义的XYZ三条坐标轴构成了一个立体空间 Z轴位置与视线方向相同 空间转换 平移 属性&#xff1a; transform: translate3d(x,y,z);transform: translateX();transform: translateY();transform: translateZ(); 取值&#xff1a;像素单位数值…

国内教育科技公司自研大语言模型

好未来的数学大模型九章大模型&#xff08;MathGPT&#xff09; 2023年8月下旬&#xff0c;在好未来20周年直播活动中&#xff0c;好未来公司CTO田密宣布好未来自研的数学领域千亿级大模型MathGPT正式上线并开启公测。根据九章大模型的官网介绍&#xff0c;九章大模型&#xff…