DM-分析函数

分析函数

主要用户计算基于组的某种聚合值。这是一种更加简便的方式,否则必须使用连接查询,子查询或视图,存储过程实现。

分析函数对每组返回多行数据,多行形成的组称为窗口,窗口决定当前执行的计算范围。
分析函数分为11类:

  • COUNT(*);
  • 完全分析函数 AVG|MAX|MIN| COUNT|SUM
  • 方差函数 VAR_POP、 VAR_SAMP、 VARIANCE、 STDDEV_POP、 STDDEV_SAMP、
    STDDEV;
  • 协方差函数 COVAR_POP、 COVAR_SAMP、 CORR;
  • 首尾函数 FIRST_VALUE、 LAST_VALUE;
  • 相邻函数 LAG 和 LEAD;
  • 分组函数 NTILE;
  • 排序函数 RANK、 DENSE_RANK、 ROW_NUMBER;
  • 百分比函数 PERCENT_RANK、 CUME_DIST、 RATIO_TO_REPORT、PERCENTILE_CONT、 NTH_VALUE;
  • 字符串函数 LISTAGG;
  • 指定行函数 NTH_VALUE。
使用限制
  • 分析函数只能出现在选择项或ORDER BY子句。
  • 有DISTINCE时不允许ORDER BY 一起使用。
  • 不允许嵌套使用。分析函数参数中,PARATITION BY,ORDER BY 项中不允许使用分析函数。
  • 只有 MIN、 MAX、 COUNT、 SUM、 AVG、 STDDEV、 VARIANCE 的参数支持 DISTINCT,其他分析函数的参数不允许为 DISTINCT;
  • FIRST_VALUE 分析函数返回组中数据窗口的第一个值, LAST_VALUE 表示返回
  • 组中数据窗口 ORDER BY 项相同的最后一个值;
  • FIRST_VALUE/LAST_VALUE/LAG/LEAD/NTH_VALUE 函 数 支 持RESPECT|IGNORE NULLS 子句,该子句用来指定计算中是否跳过 NULL 值;

具体使用
一般分析函数
语法格式:

<分析函数>::=<函数名>(<参数>) OVER (<分析子句>)
<分析子句>::= [<PARTITION BY 项>] [<ORDER BY 项> [<窗口子句>]]
<PARTITION BY 项>::= PARTITION BY <<常量表达式>| <列名>>
<ORDER BY 项>::= ORDER BY <<常量表达式>| <列名>>
<窗口子句>::=<ROWS | RANGE > < <范围子句 1>|<范围子句 2> >
<范围子句 1>::=

使用示例

创建测试表STU

CREATE TABLE "SYSDBA"."STU"
(
"ID" INT NOT NULL,
"NAME" VARCHAR(50),
"SCORE" FLOAT,
"CLASSES" VARCHAR(50),
CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;

插入测试数据
在这里插入图片描述
查询每个班的平均成绩

SELECT CLASSES, NAME, SCORE, AVG(SCORE) OVER(partition by CLASSES) as AVG from STU;

在这里插入图片描述

查询按成绩排名的学生姓名和排名

SELECT NAME, RANK() OVER(ORDER BY SCORE DESC) AS RANK FROM STU;

在这里插入图片描述
查询成绩90以上的班级和学生个数

SELECT CLASSES, COUNT(*) OVER (PARTITION BY SCORE ) AS NUM FROM STU WHERE SCORE > 90;

在这里插入图片描述

排名函数RANK, DENSE_RANK和ROW_NUMBER

查看当前数据:有两个78和两个92.5

SELECT *FROM STU;

在这里插入图片描述
当使用RANK函数排名时,值相同,排名相同,但后续排名根据前面排名的相同个数顺延。

SELECT NAME, RANK() OVER(ORDER BY SCORE DESC) AS RANK FROM STU;

在这里插入图片描述
使用DENSE_RANK函数,值相同,排名相同,但后续排名和相同排名之间连续。

SELECT NAME, DENSE_RANK () OVER(ORDER BY SCORE DESC) AS RANK FROM STU;

在这里插入图片描述
使用ROW_NUMBER函数排名,值相同时的排名也不同,且每个值的排名连续。

SELECT NAME, ROW_NUMBER () OVER(ORDER BY SCORE DESC) AS RANK FROM STU;

在这里插入图片描述

FIRST, LAST

查询每个班级的第一名和最后一名

SELECT DISTINCT CLASSES, 
MAX(SCORE) KEEP(DENSE_RANK FIRST ORDER BY SCORE DESC) OVER(PARTITION BY CLASSES) MAX_VAL,
MIN(SCORE) KEEP(DENSE_RANK FIRST ORDER BY SCORE ASC) OVER(PARTITION BY CLASSES) MIN_VAL
FROM STU;

在这里插入图片描述
1.2.3 分组NTILE
根据分数将学生分为三组

SELECT NAME, NTILE(3) OVER(ORDER BY SCORE DESC) AS ZU FROM STU;

在这里插入图片描述

排列百分比PERCENT_RANK()

计算每个分数所占的百分比

SELECT SCORE, PERCENT_RANK() OVER(ORDER BY SCORE DESC) AS BAI FROM STU;

在这里插入图片描述

RATIO_TO_REPORT

计算某一样本值所占百分比
计算每个分数在所属班级中的百分比

SELECT CLASSES, RATIO_TO_REPORT(SCORE) OVER(PARTITION BY CLASSES) AS RAT FROM STU;

在这里插入图片描述

情况表达式

查询分数,90以上返回优秀,80-90返回合格,80以下返回还需努力。

SELECT NAME, CASE WHEN SCORE > 90 THEN '优秀' WHEN SCORE <= 90 AND SCORE >=80 THEN '合格' ELSE '还需努力' END AS "成绩" FROM STU; 

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux dm-verity是一个Linux内核模块,用于对块设备进行数据完整性校验。它通过使用哈希函数和预先计算的哈希树来实现校验,可以防止恶意修改或篡改块设备的数据。 dm-verity的源代码位于Linux内核的"drivers/md/dm-verity.c"文件。该文件包含了实现dm-verity功能所需的所有函数和数据结构。 dm-verity的主要流程如下: 1. 初始化:在加载模块时,dm-verity会注册自己为块设备处理器,并初始化一些数据结构和参数。 2. 设置参数:当用户通过命令行或者sysfs文件系统设置dm-verity参数时,dm-verity会解析这些参数并存储到对应的数据结构。 3. 启动校验:当用户通过命令行或者sysfs文件系统启动dm-verity时,dm-verity会从块设备读取哈希树,并使用哈希函数进行校验。 4. 处理请求:当用户对块设备发出读写请求时,dm-verity会拦截这些请求并进行数据校验。如果数据完整,则将请求转发到原始的块设备;如果数据不完整,则返回错误 ### 回答2: Linux dm-verity是一种用于数据完整性校验的Linux内核模块。它通过计算数据块的校验值,确保数据在存储或传输过程没有被篡改。下面对dm-verity的源码进行解析。 dm-verity的源码位于Linux内核的源码树的drivers/md/dm-verity目录下。主要的源码文件包括verity_target.c、verity_blk.c和verity_metadata.c。 verity_target.c文件实现了dm-verity的核心逻辑。它定义了用于创建和管理verity设备的API接口函数。在这个文件dm-verity模块会将读取和写入请求传递给真实的存储设备,并使用verity_blk.c函数来计算和验证数据的校验值。它还负责处理校验失败的情况,例如将读取请求重定向到镜像设备。 verity_blk.c文件实现了校验块设备的功能。它使用了基本块设备的API函数,例如bio和request_queue,来处理请求。在这个文件,校验模块会计算每个数据块的哈希值,将其与元数据的预期值进行比较,并确定数据的完整性。这个过程是通过使用散列函数和加密算法来计算和比较校验值的。 verity_metadata.c文件定义了元数据的结构和操作函数。元数据是用于存储每个数据块的哈希值和其他校验相关信息的地方。它使用了dm自带的二叉树数据结构来组织数据块。 除了这些源码文件,dm-verity还涉及到一些其他的文件,如kconfig和Makefile等。这些文件用于配置和编译dm-verity模块,并将其与Linux内核进行集成。 总结起来,Linux dm-verity源码的解析涉及到多个文件,用于实现数据完整性校验的各个方面,包括读写请求的管理、校验值的计算和验证、元数据的存储等。通过分析这些源码文件,我们可以更深入地了解dm-verity模块的工作原理和实现细节。 ### 回答3: DM-Verity 是一种用于保护 Linux 文件系统完整性的技术。它基于数据验证和完整性保护,可防止篡改和数据损坏。DM-Verity的源代码解析可以帮助我们了解其工作原理和实现细节。 DM-Verity 的源代码主要分为两个部分:内核模块和用户空间工具。 内核模块部分是通过 Linux 内核的 Device Mapper(DM)框架实现的。它包含了核心的验证逻辑,在存储设备的块层进行数据验证。DM-Verity使用 Merkle 树的数据结构来计算和验证每个块的哈希值,这些哈希值存储在一个元数据区域。当读取文件时,DM-Verity会对读取的数据块进行哈希计算,并与元数据的哈希进行比对,以验证数据的完整性。如果哈希不匹配,则说明数据已被篡改。 用户空间工具部分提供了一套命令行工具来配置和管理 DM-Verity。主要的工具有 veritysetup 和 fsverityctl。veritysetup用于创建和配置DM-Verity设备,包括进行根文件系统的完整性保护。fsverityctl用于管理和查询已配置的 DM-Verity 设备,提供了一些实用的操作,比如启用和禁用 DM-Verity,查询校验结果等。 通过分析 DM-Verity 的源代码,我们可以了解到其实现的核心原理和具体实现细节。例如,可以了解到 DM-Verity 是如何在内核通过设备映射层实现数据验证和完整性保护的。此外,还可以学习到DM-Verity如何使用 Merkle 树来计算和验证数据块的哈希值,以及如何通过元数据区域存储和管理这些哈希值。对于学习和理解 Linux 文件系统的完整性保护机制以及数据安全性的提升,DM-Verity的源代码解析是非常有价值的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值