当前位置: 首页 > news >正文

网站版面如何设计Wordpress页面图片设计

网站版面如何设计,Wordpress页面图片设计,网页被禁止浏览怎么解决,网站注册免费MySQL高级功能:窗口函数窗口函数简介 核心概念:窗口函数对一组与当前行相关的行执行计算。关键点在于,它不会像 GROUP BY 那样将多行合并为单个输出行,而是为每一行返回一个值,同时保留原始行的所有细节。 你可以把它想…

MySQL高级功能:窗口函数

  1. 窗口函数简介

    核心概念:窗口函数对一组与当前行相关的行执行计算。关键点在于,它不会像 GROUP BY 那样将多行合并为单个输出行,而是为每一行返回一个值,同时保留原始行的所有细节。

    你可以把它想象成:为每一行数据都开一个“窗口”,这个“窗口”定义了计算所基于的数据集(如同行、前几行、后几行、整个分区等),然后在这个窗口上进行计算,并将结果直接附加到当前行上。

  2. 窗口函数基本语法

    SELECTcolumn1,column2,window_function(column3) OVER ([PARTITION BY partition_expression][ORDER BY order_expression [ASC | DESC]][frame_clause]) AS alias_name
    FROM table_name;
    

    核心组成部分解析

    1. window_function: 要使用的窗口函数名称(例如 ROW_NUMBER, SUM, RANK 等)。
    2. OVER 子句: 定义窗口的规则。这是窗口函数的灵魂。
      • PARTITION BY: 类似于 GROUP BY,它将结果集划分为不同的分区(组)。窗口函数会独立地应用于每个分区。如果省略,整个结果集就是一个分区。
      • ORDER BY: 定义分区内数据的排序方式。对于排名函数(如 RANK)和计算累计和的函数(如 SUM)至关重要。它还会影响 frame_clause 的默认行为。
      • frame_clause: 定义当前行所在分区中的一个子集(窗口帧)。语法通常是 ROWS BETWEEN start AND end
        • start/end 可以是:
          • UNBOUNDED PRECEDING:分区的第一行
          • UNBOUNDED FOLLOWING:分区的最后一行
          • n PRECEDING:当前行之前的第 n 行
          • n FOLLOWING:当前行之后的第 n 行
          • CURRENT ROW:当前行
        • 示例ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING 表示窗口包含当前行、前一行和后一行。
  3. 常用窗口函数分类及示例

    1. 序号函数 (Ranking Functions):为每一行分配一个唯一的序号或排名。

      • ROW_NUMBER(): 为分区内的每一行分配一个唯一的连续序号(无论值是否相同)。

        -- 为每个部门的员工按销售额排名(同分也不同名)
        SELECT *,ROW_NUMBER() OVER (PARTITION BY department ORDER BY amount DESC) AS dept_sale_rank
        FROM sales;
        
      • RANK(): 分配排名,值相同时排名相同,但会留下空位(例如:1, 2, 2, 4)。

        -- 排名,同分则同名,下一个排名会跳号
        SELECT *,RANK() OVER (ORDER BY amount DESC) AS overall_rank
        FROM sales;
        
      • DENSE_RANK(): 分配排名,值相同时排名相同,且不会留下空位(例如:1, 2, 2, 3)。

        -- 排名,同分则同名,下一个排名不跳号
        SELECT *,DENSE_RANK() OVER (ORDER BY amount DESC) AS `dense_rank`
        FROM sales;
        
    2. 分布函数 (Distribution Functions): 计算每行在其分区中的百分比排名(公式: (rank - 1) / (rows - 1))。

      • NTILE(n): 将分区内的数据分成 n 个大致相等的组,并分配组号。

        -- 将总销售额按金额分为4个桶
        SELECT *,NTILE(4) OVER (ORDER BY amount DESC) AS quartile
        FROM sales;
        
    3. 前后值函数 (Value Functions):访问同一分区中其他行的值。

      • LAG(column, offset, default_value): 返回当前行之前 offset 行的值,若不存在则为default_value

        -- 查看每位员工上一次的销售额
        SELECT employee, sale_date, amount,LAG(amount, 1, 0) OVER (PARTITION BY employee ORDER BY sale_date) AS prev_sale_amount
        FROM sales;
        
      • LEAD(column, offset, default_value): 返回当前行之后 offset 行的值,若不存在则为default_value

        -- 查看每位员工下一次的销售额
        SELECT employee, sale_date, amount,LEAD(amount, 1, 0) OVER (PARTITION BY employee ORDER BY sale_date) AS next_sale_amount
        FROM sales;
        
      • FIRST_VALUE(column) / LAST_VALUE(column): 返回窗口帧内的第一个/最后一个值。

        -- 查看每个部门内的最高销售额(显示在每一行)
        SELECT *,FIRST_VALUE(amount) OVER (PARTITION BY department ORDER BY amount DESC) AS dept_highest_sale
        FROM sales;
        
    4. 聚合函数 (Aggregate Functions as Window Functions):所有标准聚合函数(如 SUM, AVG, COUNT, MAX, MIN)都可以用作窗口函数。

      • SUM() 用于计算累计和

        -- 计算每位员工的累计销售额
        SELECT employee, sale_date, amount,SUM(amount) OVER (PARTITION BY employee ORDER BY sale_date) AS running_total
        FROM sales;
        
      • AVG() 用于计算移动平均

        -- 计算每位员工最近3天的平均销售额(包括当天)
        SELECT employee, sale_date, amount,AVG(amount) OVER (PARTITION BY employee ORDER BY sale_date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg
        FROM sales;
        
  4. 注意事项

    • 版本要求:窗口函数从 MySQL 8.0 版本开始才被支持。如果你使用的是旧版本,将无法利用这些功能。
    • LAST_VALUE()的陷阱:直接使用 LAST_VALUE()可能无法得到分区最后一行,因为其默认窗口范围是 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW。要获取最后一行,通常需要显式指定框架:LAST_VALUE(expr) OVER (ORDER BY cols RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
  5. 附录

    假设我们有一张salse表:有以下数据

    -- 创建 sales 表
    CREATE TABLE sales (sale_id INT PRIMARY KEY AUTO_INCREMENT,employee VARCHAR(50) NOT NULL,department VARCHAR(50) NOT NULL,sale_date DATE NOT NULL,amount DECIMAL(10, 2) NOT NULL
    );-- 插入示例数据
    INSERT INTO sales (employee, department, sale_date, amount) VALUES
    -- 销售部门数据
    ('Alice', 'Sales', '2023-10-01', 100.00),
    ('Bob', 'Sales', '2023-10-01', 150.00),
    ('Alice', 'Sales', '2023-10-02', 110.00),
    ('Bob', 'Sales', '2023-10-02', 120.00),
    ('Charlie', 'Sales', '2023-10-02', 200.00), -- 新员工
    ('Alice', 'Sales', '2023-10-03', 130.00),
    ('Bob', 'Sales', '2023-10-03', 140.00),
    ('Charlie', 'Sales', '2023-10-03', 180.00),
    ('Alice', 'Sales', '2023-10-04', 120.00), -- 销售额下降
    ('Bob', 'Sales', '2023-10-04', 160.00),
    ('Charlie', 'Sales', '2023-10-04', 220.00), -- 最高销售额-- 市场部门数据
    ('David', 'Marketing', '2023-10-01', 300.00), -- 高价值销售
    ('Eva', 'Marketing', '2023-10-01', 250.00),
    ('David', 'Marketing', '2023-10-02', 280.00),
    ('Eva', 'Marketing', '2023-10-02', 270.00),
    ('Frank', 'Marketing', '2023-10-02', 320.00), -- 新员工,高销售额
    ('David', 'Marketing', '2023-10-03', 310.00),
    ('Eva', 'Marketing', '2023-10-03', 260.00),
    ('Frank', 'Marketing', '2023-10-03', 330.00),
    ('David', 'Marketing', '2023-10-04', 290.00), -- 销售额下降
    ('Eva', 'Marketing', '2023-10-04', 280.00),
    ('Frank', 'Marketing', '2023-10-04', 350.00), -- 最高销售额-- IT部门数据(较少销售记录)
    ('Grace', 'IT', '2023-10-02', 500.00), -- 非常高价值的销售
    ('Henry', 'IT', '2023-10-03', 450.00),
    ('Grace', 'IT', '2023-10-04', 550.00), -- 最高销售额-- 添加一些相同销售额的记录,用于测试排名函数
    ('Ivy', 'Sales', '2023-10-05', 200.00), -- 与Charlie某天销售额相同
    ('Jack', 'Sales', '2023-10-05', 200.00); -- 与Charlie某天销售额相同
    

    现在你可以使用这个数据集测试各种窗口函数:

    1. 部门内销售额排名
    SELECT *,ROW_NUMBER() OVER (PARTITION BY department ORDER BY amount DESC) AS `row_num`,RANK() OVER (PARTITION BY department ORDER BY amount DESC) AS `rank`,DENSE_RANK() OVER (PARTITION BY department ORDER BY amount DESC) AS `dense_rank`
    FROM sales
    ORDER BY department, amount DESC;
    
    1. 员工销售额累计

      SELECT employee, sale_date, amount,SUM(amount) OVER (PARTITION BY employee ORDER BY sale_date) AS running_total
      FROM sales
      ORDER BY employee, sale_date;
      
    2. 部门内移动平均(3天内amount的平均值)

      SELECT department, sale_date, amount,AVG(amount) OVER (PARTITION BY department ORDER BY sale_date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg
      FROM sales
      ORDER BY department, sale_date;
      
    3. 访问前后行数据

      SELECT employee, sale_date, amount,LAG(amount, 1) OVER (PARTITION BY employee ORDER BY sale_date) AS prev_day_sale,LEAD(amount, 1) OVER (PARTITION BY employee ORDER BY sale_date) AS next_day_sale,amount - LAG(amount, 1) OVER (PARTITION BY employee ORDER BY sale_date) AS day_over_day_change
      FROM sales
      ORDER BY employee, sale_date;
      
    4. 部门内销售额占比

    SELECT employee, department, sale_date, amount,amount / SUM(amount) OVER (PARTITION BY department, sale_date) * 100 AS pct_of_daily_dept_sales
    FROM sales
    ORDER BY department, sale_date, amount DESC;
    
    1. 还有许多应用场景…
http://www.dtcms.com/a/538456.html

相关文章:

  • 网站建设的seo策略crm和scrm有什么区别
  • 杭州集团网站建设方案深圳专业app网站开发
  • 新乡专业做淘宝网站网站设计重要性
  • 公司微网站怎么做的怎么弄推广广告
  • 交通建设门户网站wordpress 去掉主题版权
  • 网站后台登入密码忘记了广告设计专业的单招学校
  • 网站备案万网东莞网站制作网站设计
  • 读论文--Vision Transformer with Deformable Attention(DAT)完整教程
  • 山东网站设计微商城是怎么做的
  • 阿里云可以建设多个网站在线资源
  • 潮牌衣服网站建设可行性分析永久免费云服务器申请
  • 紫金网站建设广告制作包括范围
  • 长沙公司网站模板制作方案门户网站建设服务收费
  • 找黄岩做网站企业开发wordpress主题赚钱
  • 设计自学网站哪个好搜索引擎推广简称
  • 花钱也可以哪些网站可以做推广广告微信小程序开通多少钱
  • 广州协会网站建设课程开发公司
  • 湖南营销型网站建设 A磐石网络天津网站建设如何
  • 大语言模型的知识蒸馏综述
  • 做外贸的在哪些网站找工作设计网站案例
  • 朝阳建筑工程建设网站公司的网站建设与维护
  • 深圳快速网站制作哪里好电商网平台
  • LeetCode - 无重复字符的最长子串
  • ELK3——kibana
  • 国内购物网站大全濮阳新闻综合频道直播
  • 互联壹佰做企业网站网站快速排名公司
  • 乐清建设网站公司制作一个网站
  • 企业黄页信息查询网seo详细教程
  • 做墙绘一般在哪个网站做医药商城网站的公司吗
  • 广州冼村地铁站几号线网页制作源代码