Mysql窗口函数

Mysql窗口函数 一、什么是窗口函数? 窗口函数是一种在查询结果的"窗口"上执行计算的函数,它不会像常规聚合函数那样将多行合并为一行,而是为每一行返回一个值,同时保持原始行数不变。 基本语法 <窗口函数>(<参数>) OVER ( [PARTITION BY <分区表达式>] [ORDER BY <排序表达式> [ASC | DESC]] [ROWS/RANGE <窗口范围>] ) ‌<窗口函数>‌:可以是聚合函数(如SUM、AVG)或专用函数(如ROW_NUMBER、RANK)。‌‌ ‌OVER()‌:必需子句,定义窗口框架。‌‌ ‌PARTITION BY‌:可选,用于分组数据;若省略,窗口覆盖整个结果集。 ‌ORDER BY‌:可选,指定窗口内行的排序顺序。‌‌ ‌窗口范围‌:可选,默认ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW。‌‌ 二、 准备测试数据 -- 创建销售数据表 CREATE TABLE sales ( sale_id INT PRIMARY KEY, salesperson VARCHAR(50), region VARCHAR(50), sale_date DATE, amount DECIMAL(10,2) ); INSERT INTO sales VALUES (1, '张三', '北京', '2023-01-15', 5000), (2, '李四', '上海', '2023-01-16', 8000), (3, '王五', '北京', '2023-01-17', 6000), (4, '张三', '北京', '2023-02-01', 7000), (5, '李四', '上海', '2023-02-02', 9000), (6, '赵六', '广州', '2023-02-03', 4000), (7, '王五', '北京', '2023-02-04', 5500), (8, '张三', '北京', '2023-03-01', 8500); -- 创建员工薪资表 CREATE TABLE employee_salary ( emp_id INT, name VARCHAR(50), department VARCHAR(50), salary DECIMAL(10,2), hire_date DATE ); INSERT INTO employee_salary VALUES (1, '张三', '技术部', 15000, '2020-01-15'), (2, '李四', '技术部', 12000, '2021-03-20'), (3, '王五', '销售部', 8000, '2022-06-10'), (4, '赵六', '销售部', 7500, '2022-08-05'), (5, '钱七', '技术部', 13000, '2020-11-30'), (6, '孙八', '人事部', 9000, '2021-09-15'), (7, '周九', '技术部', 16000, '2019-05-20'); 1....

2025年02月20日 · 4 min · Leanku

MyCat实现Mysql分库分表

Mysql分库分表和主从复制 MyCat 实现分库分表 MySQL 的分库分表解决方案通常依赖于中间件来实现水平扩展。常见的中间件有以下几种 MyCat ShardingSphere TDDL (Taobao Distributed Data Layer) Cobar Vitess MyCat 是一款开源的数据库中间件,支持 MySQL 数据库的分库分表功能。 使用 MyCat 实现分库分表的过程包括多个步骤,涉及配置 MyCat 和数据库的分片策略,路由规则等。下面通过一个实际案例来详细解释 MyCat 的实现原理、方式和步骤。 案例背景 假设你有一个电商系统,包含一个 orders 表,记录用户的订单信息。随着数据量的增长,单一数据库难以满足性能需求,因此需要进行 分库分表。 实现原理 MyCat 是一种数据库中间件,支持分库分表。它的原理是通过代理 MySQL 连接,将 SQL 请求转发到实际的数据库实例上。MyCat 会根据预定义的路由规则(如分片策略)来决定将查询请求路由到哪个数据库或表。 MyCat 的 分库分表原理如下: 分库:将数据按照某种规则分配到多个数据库实例中。例如,按用户的 ID 来分库。 分表:将一个大表拆分成多个小表,避免单表的数据过大导致查询性能下降。例如,可以按时间范围或数据量来分表。 实现方式 MyCat 的实现方式主要通过 配置分片规则 来实现分库分表。配置内容包括: 数据源配置:定义数据库实例。 分片规则配置:指定哪些字段用于分片,如何分片(按范围、按哈希等)。 路由规则配置:根据 SQL 查询的条件来路由请求到不同的数据库或表。 实现步骤 安装并启动 MyCat 下载 MyCat 安装包并解压。 配置 MyCat 启动脚本,启动 MyCat。 cd MyCat ./bin/start.sh 配置数据源 在 MyCat 的配置文件 conf/context....

2025年02月18日 · 3 min · Leanku

Linux grep命令

Linux grep命令 全拼:Global search REgular expression and Print out the line. 作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查,打印匹配到的行. 模式:由正则表达式的元字符及文本字符所编写出的过滤条件﹔ grep的语法格式: grep -option(参数) ‘word’(关键词) file(文本文件); grep常用参数: –color=auto 或者 –color:表示对匹配到的文本着色显示 -i:在搜索的时候忽略大小写 -n:显示结果所在行号 -c:统计匹配到的行数,注意,是匹配到的总行数,不是匹配到的次数 -o:只显示符合条件的字符串,但是不整行显示,每个符合条件的字符串单独显示一行 -v:输出不带关键字的行(反向查询,反向匹配) -w:匹配整个单词,如果是字符串中包含这个单词,则不作匹配 -Ax:在输出的时候包含结果所在行之后的指定行数,这里指之后的x行,A:after -Bx:在输出的时候包含结果所在行之前的指定行数,这里指之前的x行,B:before -Cx:在输出的时候包含结果所在行之前和之后的指定行数,这里指之前和之后的x行,C:context -e:实现多个选项的匹配,逻辑or关系 -q:静默模式,不输出任何信息,当我们只关心有没有匹配到,却不关心匹配到什么内容时,我们可以使用此命令,然后,使用”echo $?”查看是否匹配到,0表示匹配到,1表示没有匹配到。 -P:表示使用兼容perl的正则引擎。 -E:使用扩展正则表达式,而不是基本正则表达式,在使用”-E”选项时,相当于使用egrep。 示例 # 从test.txt文本文件中搜索包含”L”字符的行 grep "L" test.txt # 输出以 I 开头的行(不区分大小写) grep "^i" test.txt -i -n -o # 可以使用”--color”选项,高亮显示行中的关键字 grep "L" test.txt -i -n --color # -B”选项,显示符合条件的行之前的行,"B"有before之意 grep "L" test.txt -i -n --color -B2 # "-A"有After之意,"-A"代表显示符合条件的行的同时,还要显示之后的行,"-A3"表示同时显示符合条件的行之后的3行。 grep "L" test....

2025年02月17日 · 2 min · Leanku

Linux sed命令

Linux sed命令 全拼:Stream EDitor(流编辑器) Linux sed 命令是利用脚本来处理文本文件,sed 可依照脚本的指令来处理、编辑文本文件。Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。 sed 的运行模式 当处理数据时,Sed 从输入源一次读入一行,并将它保存到所谓的模式空间pattern space中。所有 Sed 的变换都发生在模式空间。变换都是由命令行上或外部 Sed 脚本文件提供的单字母命令来描述的。大多数 Sed 命令都可以由一个地址或一个地址范围作为前导来限制它们的作用范围。 sed的相关选项 -n, –quiet, –silent 取消自动打印模式空间 -e 脚本, –expression=脚本 添加“脚本”到程序的运行列表 -f 脚本文件, –file=脚本文件 添加“脚本文件”到程序的运行列表 –follow-symlinks 直接修改文件时跟随软链接 -i[扩展名], –in-place[=扩展名] 直接修改文件(如果指定扩展名就备份文件) -l N, –line-length=N 指定“l”命令的换行期望长度 –posix 关闭所有 GNU 扩展 -r, –regexp-extended 在脚本中使用扩展正则表达式 -s, –separate 将输入文件视为各个独立的文件而不是一个长的连续输入 -u, –unbuffered 从输入文件读取最少的数据,更频繁的刷新输出 –help 打印帮助并退出 –version 输出版本信息并退出 -a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~ -c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行! -d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;...

2025年02月17日 · 1 min · Leanku

Linux 进程管理命令

Linux ps命令 ps 命令是 Process Status 的缩写,是一个命令行实用程序,用于显示或查看与Linux系统中运行的进程相关的信息。 命令原理:ps 是通过读取虚拟文件:/proc 拿到进程数据的,不需要给 ps 设置任何的权限就可以运行。 在Linux中,每个进程都有多个ID来关联它,包括: Process ID (PID),即进程ID 这是标识进程的任意数字。每个进程都有一个唯一的ID,但是在进程退出并且父进程检索了退出状态之后,进程ID将被释放,供新进程重用。 Parent Process ID (PPID),即父进程ID 如果父进程在子进程退出之前退出,则子进程的PPID将更改为另一个进程。 Process Group ID (PGID) 这是进程组leader的PID。如果PID == PGID,则此进程是进程组领导。 Session ID (SID) 这是会话领导者的PID。如果PID == SID,则此进程为会话领导进程。 会话和进程组只是将一些相关的进程作为一个单元来对待的方法。一个进程组的所有成员总是属于同一个会话,但是一个会话可以有多个进程组。 通常,shell将是会话领导者,该shell执行的每个管道将是一个进程组。这是为了在shell退出时很容易杀死它的子进程。 grep -option(参数) ‘word’(关键词) file(文本文件); ps命令选项: 简单筛选 a :选择所有进程(BSD-Style)。 -A :选择所有进程,与 -e 等同(标准格式)。 -a :选择除 session 领导者和没有与终端关联的进程之外的所有进程。 -d :选择除了 session leader 的所有进程。 –deselect :选择除满足指定条件之外的所有进程,即反选,与 -N 等同。 -e :选择所有进程,与 -A 等同。 -N :与 –deselect 等同。...

2025年02月17日 · 3 min · Leanku

Chrome 插件开发实战:一键把当前页面存为 Markdown

从一行代码到 Chrome Web Store 上架。本文用一个具体例子走通 Chrome 插件开发完整流程:manifest.json、content script、popup 通信、文件下载、用户偏好存储、上架审核。 为什么要做这个插件 我经常在浏览器里看技术文章。看到好的想存到 Obsidian,复制粘贴格式全乱。打开"另存为"保存下来是带广告、导航栏、侧边栏的 HTML。想找一个干净的 Markdown 版本,要么没有,要么是闭源插件不敢装。 装个现成插件不放心。写个 userscript 分发麻烦。干脆自己写一个。 这是个"改造已有网站"的小工具,Chrome 插件是最合适的形态。如果你还不确定插件是不是解决你问题的最佳方案,可以先看 《Chrome 插件开发》。 我们要做的版本 最终交付一个能本地转、能下载、能存用户偏好的插件: 点击工具栏图标,弹出一个 popup popup 上一个按钮"保存为 Markdown" 点击后,把当前页面转成干净的 Markdown,触发下载 几个 checkbox 让用户自定义:是否包含图片、是否包含代码块、文件名格式 这个版本足够简单,又覆盖了插件开发的核心链路:content script、popup 通信、文件下载、用户偏好存储。 准备工作 需要: Chrome 浏览器(任何最近版本都行) 一个空文件夹 一个文本编辑器 不需要: Node.js npm 任何前端框架 任何构建工具 整个项目就是几个静态文件,加一个第三方库。装一个依赖就要搭构建,搭构建就要讲 webpack / vite / TypeScript,整个文章会跑偏。 第三方库:Turndown.js 用来把 HTML 转成 Markdown。同类插件 80% 在用,成熟稳定。 下载地址:https://unpkg.com/[email protected]/dist/turndown.js 下载下来保存到 vendor/turndown.js(自己创建 vendor 目录)。 项目结构: markdown-saver/ ├── manifest.json ├── content....

2025年01月22日 · 8 min · Leanku

Chrome 插件开发

从一个真实问题开始 我经常在浏览器里看技术文章。看到好的想存到 Obsidian,复制粘贴格式全乱。打开"另存为"保存下来是带广告、导航栏、侧边栏的 HTML。想找一个干净的 Markdown 版本,要么没有,要么是闭源插件不敢用。 于是我开始想:我能不能自己写一个? 这是个典型的"想动手"时刻。但真正动手之前,有几个更前置的问题需要想清楚: Chrome 插件到底是什么?和 userscript、网页工具、PWA 差在哪? 我想做的这个事,到底该用哪种形态? 学 Chrome 插件的"投资回报"如何?是一次性投入还是持续折腾? 写这篇文章的目的,是在你打开 manifest.json 之前,帮你想清楚这三个问题。 插件是什么 先把"插件"这个词拆开看。 Chrome 插件(Chrome Extension),也叫浏览器扩展,本质上是一段运行在 Chrome 浏览器里的代码。它能访问一些普通网页拿不到的 API,比如读取当前标签页的 URL、修改请求头、在用户点击工具栏图标时弹出一个小页面。 可以把它理解为: 插件 = 对浏览器的扩展能力 + 对已有网站的增强能力 注意两个关键词:“对浏览器” 和 “对已有网站”。这两个词决定了插件能做什么、不能做什么。 对浏览器意味着插件能拿到浏览器层面的能力,比如: 操作标签页(关闭、新建、切换) 读取和修改浏览器历史 拦截和修改网络请求 在工具栏添加图标 监听键盘快捷键 对已有网站意味着插件的核心战场是"改造现有网站",比如: 给维基百科加一个深色模式 给 GitHub 加一个一键复制文件链接的按钮 给掘金、知乎、CSDN 屏蔽某些干扰元素 插件能做什么、不能做什么 能做的: 改造已有网站(修改 DOM、注入脚本) 提供一个常驻工具栏入口(点击图标触发动作) 跨页面保存数据(用户的偏好、笔记、历史) 监听浏览器事件(标签页变化、下载事件) 不能做(或做起来很费劲): 完全独立的产品(需要服务端配合的复杂功能) 移动端体验(Chrome 插件不适用于移动浏览器) 高性能要求的事(不适合跑复杂的计算任务) 跨浏览器一致体验(Firefox、Edge、Safari 各有差异) 什么时候该用插件 给几个真实场景,帮你判断。 适合用插件的场景: 改造已有网站:给某个你不喜欢的网站加功能或去干扰 跨页面工具:复制当前页面内容、抓取数据、自动填表 浏览器层的小工具:标签页管理、下载管理、截图、翻译 给开发者自己用:调试、API 测试、页面抓取 不适合用插件的场景:...

2025年01月15日 · 3 min · Leanku

视频内容处理工具分享之 VideoLingo

视频内容处理工具分享之 VideoLingo VideoLingo 是目前处理视频技术内容最强的开源工具之一。它的核心优势在于不仅仅是“语音转文字”,它还会利用 AI(如 DeepSeek 或 GPT)对内容进行 NLP 断句(让文字像书一样好读)并生成总结。 一、安装方式: 1. 最简单“一键整合包”(适合 Windows 用户) 如果你不想折腾 Python 环境,可以寻找社区维护的一键整合包(如 GitHub 上的 VideoLingo-OneClick 项目)。 下载:从网盘或 GitHub Releases 下载解压包。 启动:双击 启动软件.exe 或 一键启动.bat。 配置:它会弹出一个网页界面。在左侧填入你的 LLM API Key(支持 DeepSeek、OpenAI 等,技术总结必须用到大模型)。 2. 标准安装 如果你想体验最新功能,建议通过源码安装: 1. 准备环境 安装 Python 3.10(必须是这个版本)。 安装 FFmpeg(参考上一个回答)。 如果你有 NVIDIA 显卡,建议安装 CUDA Toolkit 12.6 以获得加速。 2. 源码下载与安装 在终端(Terminal/CMD)中执行: # 1. 克隆项目 git clone https://github.com/Huanshere/VideoLingo.git cd VideoLingo # 2. 安装依赖(需要 python=3.10 建议使用 conda) conda create -n videolingo python=3....

2025年01月11日 · 2 min · Leanku

视频下载工具分享之 yt-dlp

视频下载工具分享之 yt-dlp yt-dlp 是一个功能强大的开源命令行视频下载工具,它本身不需要像常规软件那样运行安装程序。 一、安装方式: 1. Windows 用户(最简单方法) 下载 exe 文件:前往 yt-dlp GitHub 释放页,找到并下载 yt-dlp.exe。 创建文件夹:建议在 C 盘或 D 盘根目录创建一个文件夹(如 D:\ytdlp),将下载好的 .exe 放进去。 安装 FFmpeg (重要依赖):为了能下载高画质视频并自动合并音视频,你必须下载 FFmpeg。 在同一目录下放入 ffmpeg.exe。 添加到 PATH (可选但建议):将该文件夹路径添加到系统的“环境变量”中,这样你就可以在任何地方的终端直接输入 yt-dlp 使用它了。 2. macOS 用户 推荐使用 Homebrew 快速安装: 打开终端(Terminal),输入: brew install yt-dlp ffmpeg 3. Linux 用户 大多数发行版可以直接通过包管理器安装: Ubuntu/Debian: sudo apt install yt-dlp Arch Linux: sudo pacman -S yt-dlp 或者直接下载二进制文件: sudo wget https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -O /usr/local/bin/yt-dlp sudo chmod a+rx /usr/local/bin/yt-dlp 4....

2025年01月10日 · 1 min · Leanku

GitHub 接入与 OAuth 2.0 授权全指南

接入 GitHub(第三方登录或调用 API)主要依赖 OAuth 2.0 授权协议。通过接入 GitHub,开发者可以实现“用 GitHub 账号一键登录平台”以及“获取用户公开信息、仓库数据”等功能。 1. 接入前的准备:创建 OAuth App 在开始写代码前,必须先在 GitHub 注册一个 OAuth Application。 登录 GitHub,点击右上角头像 -> Settings(设置)。 在左侧边栏最下方,点击 Developer settings(开发者设置)。 选择 OAuth Apps,点击 New OAuth App(或 Register a new application)。 填写应用信息: Application name:应用名称(如 MyApp)。 Homepage URL:应用主页地址(本地测试可填 http://localhost:3000)。 Authorization callback URL:核心字段,授权成功后的回调地址(如 http://localhost:3000/api/v1/auth/callback/github)。 点击 Register application 完成注册。 注册完成后,系统会生成: Client ID:应用的公开唯一标识。 Client Secret:密钥,点击 Generate a new client secret 生成(切记妥善保管,严禁暴露在前端)。 官方参考文档:Creating an OAuth app - GitHub Docs 2. GitHub OAuth 2....

2024年12月02日 · 3 min · Leanku