首页 > 其他分享 >CMU_15445_P3_Part4

CMU_15445_P3_Part4

时间:2025-01-21 18:31:33浏览次数:1  
标签:P3 窗口 函数 OVER PARTITION id Part4 CMU ORDER

Sort + Limit Executors + Window Functions + Top-N Optimization

这里的实现比较简单, 就不赘述了, 后续补充一下这部分的优先队列的使用, 以及选择的方式

Window Functions

窗口函数的实现才是这部分的重点

窗口函数介绍

MySQL 窗口函数是一类特殊的 SQL 函数, 用于在查询结果中对数据进行分组和排序的基础上执行计算, 而无需将结果分组到单独的行中. 与聚合函数(如 SUMAVG 等)相同, 窗口函数会新增通过聚合函数计算新增的列. 与聚合函数(如 SUMAVG 等)不同, 窗口函数不会减少结果集的行数, 而是为每一行生成一个计算值.

窗口函数的特点

  1. 保留行数:窗口函数计算后的结果不会减少数据行, 而是为每一行添加计算结果.
  2. 支持分组和排序:通过 PARTITION BYORDER BY 子句, 可以按组或按顺序计算结果.
  3. 与聚合函数结合使用:窗口函数通常与聚合函数结合使用, 为每行提供基于“窗口”的聚合结果.

窗口函数语法

窗口函数在使用时, 通用语法如下:

function_name ( [参数] )
OVER (
    [PARTITION BY column_name]
    [ORDER BY column_name]
    [ROWS | RANGE BETWEEN frame_start AND frame_end]
)

语法说明:

上述语法说明了窗口函数主要由四部分组成, 分别是, 聚合函数, 分组, 排序, 以及窗口帧

  • function_name:窗口函数名, 如 ROW_NUMBERRANKSUM 等, 通常是聚合函数, 用来生成新的 column 的函数
  • PARTITION BY:将数据分组为窗口, 根据 column value 将表中的数据进行分组.
  • ORDER BY:定义窗口内的排序方式.
  • 窗口帧:定义了窗口的范围, 即对于每一行计算的上下文数据行的范围, ROWS: 基于行的物理位置定义窗口帧, RANGE: 基于排序列的值范围定义窗口帧.

常见的窗口函数

1. 排名函数
  • ROW_NUMBER():为每组数据的每行生成唯一的连续编号.
  • RANK():为每组数据生成排名, 具有相同值的行具有相同排名, 后续排名会跳过.
  • DENSE_RANK():为每组数据生成排名, 具有相同值的行具有相同排名, 后续排名不会跳过.
示例:
sqlCopyEditSELECT
    employee_id,
    department_id,
    salary,
    ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS row_number,
    RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank,
    DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS dense_rank
FROM employees;

2. 聚合函数
  • SUM()AVG()COUNT() 等支持窗口计算.
示例:
sqlCopyEditSELECT
    department_id,
    employee_id,
    salary,
    SUM(salary) OVER (PARTITION BY department_id) AS total_salary,
    AVG(salary) OVER (PARTITION BY department_id) AS avg_salary
FROM employees;

3. 平均值计算

例如计算每个销售员的滑动平均销售额, 范围是当前行前一行到当前行后一行, 使用 `ROWS BETWEEN AND` 限定范围.

示例:
SELECT 
    salesman,
    department,
    sales_amount,
    AVG(sales_amount) OVER (
        PARTITION BY department
        ORDER BY id
        ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
    ) AS moving_avg
FROM sales;

当没有显示的使用窗口帧时, 默认的窗口帧的定义以及范围如下:
1. 对于带 ORDER BY 的窗口函数, 默认帧是 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. 表示从分区的开头到当前行.
2. 对于不带 ORDER BY 的窗口函数, 默认帧是整个分区(等价于 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) 表示整个分区的正题.

BUSTUB 中的窗口函数

BUSTUB 中为了实现起来更加简单, 对窗口函数进行了下面的限制:

  1. 省略了窗口帧, 无需处理窗口帧, 只需要处理 PARTITION BY 以及 ORDER BY 两种条件.
  2. 在同一个使用窗口函数的 SQL 语句中, 多个窗口函数的 ORDER BY 语句一定完全一致. 例如, 下面的 SQL 查询语句不支持
-- ORDER BY 的条件不一致
SELECT SUM(v1) OVER (ORDER BY v1), SUM(v1) OVER (ORDER BY v2) FROM t1;
-- 一个存在 ORDER BY, 一个不存在 ORDER BY
SELECT SUM(v1) OVER (ORDER BY v1), SUM(v2) OVER () FROM t1;

标签:P3,窗口,函数,OVER,PARTITION,id,Part4,CMU,ORDER
From: https://www.cnblogs.com/wevolf/p/18684153

相关文章

  • 题解:P3823 [NOI2017] 蚯蚓排队
    题目链接https://www.luogu.com.cn/problem/P3823分析先解决队伍的合并与分离问题。使用链表结构,分别维护每只蚯蚓的前驱和后继即可。然后考虑如何统计答案。可以对每只蚯蚓的“向后\(k\)数字串”使用字符串哈希的方式获得哈希值,再用一个哈希表存储每个哈希值出现的次数。对......
  • 洛谷 P3397:地毯 ← “二维前缀和 + 二维差分”模板题
    【题目来源】https://www.luogu.com.cn/problem/P3397【题目描述】在n×n的格子上有m个地毯。给出这些地毯的信息,问每个点被多少个地毯覆盖。【输入格式】第一行,两个正整数n,m。意义如题所述。接下来m行,每行两个坐标(x1,y1)和(x2,y2),代表一块地毯,左上角......
  • Arduino 平台下 ESP32-P4 驱动ES8311实现 MP3音频文件播放-方式2
    arduino平台下ESP32-P4开发板驱动ES8311,从SD_MMC读取MP3文件播实验程序,方式2。这个测试程序与之前的有所不同,直接使用了arduino-audio-drivers库中的ES8311驱动文件。采用arduino-audio-drivers比单独使用ES8311驱动来的更好,毕竟这个库支持ES8388,ES8311等多种芯片,程序......
  • P3456 [POI2007] GRZ-Ridges and Valleys
    P3456[POI2007]GRZ-RidgesandValleys背景本人蒟蒻,只会写DFS。本题BFS更好思路这是一道很明显的搜索题,题目要求我们找到山峰和山谷山峰?不就是在这个高度周围没有比它跟高的地方山谷?不就是在这个高度周围没有比它更矮的地方因此我们只需要用\(DFS\)遍历遇到的所......
  • 势头正猛,HTTP3的优势是什么?
    经过了多年的努力,IETF(互联网工程任务小组)正式发布了HTTP/3的RFC,这是超文本传输协议(HTTP)的第三个主要版本,完整的RFC超过了20000字,非常详细的解释了HTTP/3。HTTP历史1991HTTP/1.12009Google设计了基于TCP的SPDY2013QUIC2015HTTP/22018HTTP/3HTTP3......
  • 初见ESP32并搭建Platformio环境
    碎碎念(寒假参加了硬禾学堂的活动,拿到了基于esp32的CrowPanel开发板。TFTLCD触摸屏能玩出不少花样,lvgl,ai识别,如果可以的话想试试把屏接到f407学习一下FSMC和FATFS。第一步先从开发平台搭建开始。总体流程为在VSCode上下载platformio的插件在插件上打开新建项目并编译下载到......
  • ESP32 学习笔记(九)舵机实验
    概念舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。舵机只是一种通俗的叫法,其本质是一个伺服电机。舵机有很多规格,但所有的舵机都有外接三根线,分别用棕、红、橙三种颜色进行区分,由于舵机品牌不同,颜色也会有所差异,棕色为接地线,红色为电源正极......
  • P3518 [POI2011] SEJ-Strongbox
    P3518[POI2011]SEJ-StrongboxDescription有一个密码箱,\(0\)到\(n-1\)中的某些整数是它的密码。且满足:若\(a\)和\(b\)是它的密码,则\((a+b)\bmodn\)也是它的密码(\(a\),\(b\)可以相等)。某人试了\(k\)次密码,前\(k-1\)次都失败了,最后一次成功了。问,该密码箱最多有多......
  • CMU 15-445 23Fall总结
    注:编译、测试之前运行sudosysctlvm.mmap_rnd_bits=28BusTub'sarchitecture:1.QueryProcessing(查询处理层)负责将输入的SQL查询转化为可执行的物理查询计划。Parser(解析器):将输入的SQL字符串解析为抽象语法树(AST),检查SQL语法是否合法。Binder(绑定器):对AST进......
  • 了解ESP32睡眠模式及其功耗
    转载自:https://lastminuteengineers.com/esp32-sleep-modes-power-consumption/InsightIntoESP32SleepModes&TheirPowerConsumption TheESP32isundeniablyaworthycompetitortomanyWiFi/MCUSoCs,outperformingtheminbothperformanceandprice.......