SQL语法 ROW_NUMBER, WITH ... AS

手把手教你为ArduPilot添加自定义飞行模式:以自动巡检航线为例 本文详细介绍了如何为开源飞控ArduPilot添加自定义飞行模式,并以自动巡检航线为例,提供了从状态机设计、代码实现到地面站集成的完整开发指南。通过七步法手把手教学,帮助开发者深入理解飞控核心逻辑,实现无人机自主执行复杂巡检任务,满足行业应用定制需求。 阅读详情
 <select id="selectValuationTrend" resultType="DataVO">
        WITH ranked_data AS (
            SELECT
                CASE
                    WHEN #{dateType} = 1 THEN TO_CHAR(fes.VALUATION_DATE, 'YYYY-MM')
                    WHEN #{dateType} = 2 THEN TO_CHAR(fes.VALUATION_DATE, 'YYYY') || '-Q' || TO_CHAR(fes.VALUATION_DATE, 'Q')
                    WHEN #{dateType} = 3 THEN TO_CHAR(fes.VALUATION_DATE, 'YYYY')
                END AS timeDimension,
                nvl(fes.COMPANY_VALUATION, 0) AS companyValuation,
                nvl(fes.UNIT_PRICE, 0) AS unitPrice,
                ROW_NUMBER() OVER (
                    PARTITION BY
                        CASE
                            WHEN #{dateType} = 1 THEN TO_CHAR(fes.VALUATION_DATE, 'YYYY-MM')
                            WHEN #{dateType} = 2 THEN TO_CHAR(fes.VALUATION_DATE, 'YYYY') || '-Q' || TO_CHAR(fes.VALUATION_DATE, 'Q')
                            WHEN #{dateType} = 3 THEN TO_CHAR(fes.VALUATION_DATE, 'YYYY')
                        END
                    ORDER BY fes.VALUATION_DATE DESC
                ) AS rn
            FROM EI.ENTERPRISE_VALUATION_STATICS fes
            WHERE fes.ENTERPRISE_ID = #{enterpriseId}
              AND TO_CHAR(fes.VALUATION_DATE, 'YYYY') BETWEEN #{startDate} AND #{endDate}
        )
        SELECT timeDimension, companyValuation, unitPrice
        FROM ranked_data
        WHERE rn = 1
        ORDER BY timeDimension ASC
    </select>

上面有个完整的语法, 我们学习一下

WITH…AS

简单来说,它的作用是在执行主查询之前,先定义一个“临时结果集”。你可以把它理解为一个只在当前这条 SQL 语句中生效的临时表或视图.

提升可读性:把复杂的逻辑(如多层嵌套的子查询)拆分成一个个有名字的步骤,像写代码一样清晰

在这个例子里ranked_data 就相当于一个临时表或视图, 在其他语句里可以当子语句
oracle 12c 开始支持, mysql 8.0 支持

WITH 
    cte_name1 AS (
        -- 第一个临时结果集
        SELECT col1, col2 FROM table1 WHERE ...
    ),
    cte_name2 AS (
        -- 第二个临时结果集(可以引用 cte_name1)
        SELECT col3, col4 FROM cte_name1 WHERE ...
    )
-- 主查询(像使用普通表一样使用 CTE)
SELECT * 
FROM cte_name2;


CASE WHEN THEN ELSE END

SELECT ProductNumber, Name,
    CASE
        WHEN ListPrice = 0 THEN 'Mfg item - not for resale'
        WHEN ListPrice < 50 THEN 'Under $50'
        WHEN ListPrice >= 50 AND ListPrice < 250 THEN 'Under $250'
        WHEN ListPrice >= 250 AND ListPrice < 1000 THEN 'Under $1000'
        ELSE 'Over $1000'
    END AS Price_Range
FROM Production.Product;

这是一个字段的判断显示, 之前介绍过, 我们这略过

ROW_NUMBER() OVER (PARTITION BY)

ROW_NUMBER() OVER (
    [PARTITION BY 分组字段] 
    ORDER BY 排序字段 [ASC/DESC]
) AS 别名

和group by 一个明细的区别是, group by 的结果会减少行数,而 这个row_number() 不会, 他的主要目的就是为每一行添加一个序号, 在加需要的基础上还可以根据partition by分组

例子

departmentnamesalary
ITAlice15000
ITBob12000
ITCharlie15000
HRDavid8000
HREve9000

示例 1:全局排序(不带 PARTITION BY)

SELECT 
    department, 
    name, 
    salary,
    ROW_NUMBER() OVER (ORDER BY salary DESC) AS global_rank
FROM employees;
departmentnamesalaryglobal_rank
ITAlice150001
ITCharlie150002
ITBob120003
HREve90004
HRDavid80005
(注:Alice 和 Charlie 薪水一样,但 ROW_NUMBER() 依然会强制给出 1 和 2)

示例 2:分组内排名(带 PARTITION BY)最常用

SELECT 
    department, 
    name, 
    salary,
    ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank
FROM employees;
departmentnamesalarydept_rank
HREve90001
HRDavid80002
ITAlice150001
ITCharlie150002
ITBob120003
(注:注意看 IT 和 HR 部门各自都从 1 开始重新编号了!)

示例 3:实战场景 —— 找出每个部门薪水最高的员工(Group Top-N)

需求:只保留每个部门里薪水最高的那 1 个人。

SELECT * FROM (
    SELECT 
        department, 
        name, 
        salary,
        ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
    FROM employees
) t
WHERE rn = 1;  -- 直接在外层过滤,只要排名第 1 的
departmentnamesalaryrn
HREve90001
ITAlice150001

在最上面的例子里, 我们不是用具体的一个字段来分组的, 而是
这段代码的核心作用是:根据不同的时间粒度(月、季、年),对估值数据进行分组,并在每个分组内按时间倒序生成行号

  • 当 #{dateType} = 1(按月分组)
    CASE WHEN 返回 TO_CHAR(…, ‘YYYY-MM’)
    分组键:2023-11
    效果:所有 2023 年 11 月的数据会被分在同一组,组内按具体日期倒序排列。
  • 当 #{dateType} = 2(按季度分组)
    CASE WHEN 返回 TO_CHAR(…, ‘YYYY’) || ‘-Q’ || TO_CHAR(…, ‘Q’)
    分组键:2023-Q4
    效果:所有 2023 年第四季度的数据会被分在同一组,组内按具体日期倒序排列。
  • 当 #{dateType} = 3(按年分组)
    CASE WHEN 返回 TO_CHAR(…, ‘YYYY’)
    分组键:2023
    效果:所有 2023 年的数据会被分在同一组,组内按具体日期倒序排列。

注意 || 不是或 而是sql里的拼接符

case when 写了2次 一次是作为字符输出, 一次作废 标序且分组的

结合了 CTE (WITH)、ROW_NUMBER() 窗口函数以及 MyBatis 的动态参数,实现了一个高度动态的“按时间粒度取最新记录”的业务逻辑。

STM32F4使用CUBEMX ADC定时采样+DMA STM32、FFT、ADC、TIM 阅读详情

相关推荐

Zynq AXI DMA实战:5分钟搞懂S_AXIS_S2MM和M_AXIS_MM2S数据流(附Vivado配置截图)

本文通过Vivado实战配置,清晰解析了Zynq平台AXI DMA IP核中S_AXIS_S2MM和M_AXIS_MM2S数据流的核心概念与连接方法。文章重点阐述了数据流向、主从关系及接口命名规则,并提供了从ADC数据采集到DDR存储,再从DDR读取数据发送至DAC的完整双向数据流搭建指南,帮助工程师快速避坑。

weixin_29200741的博客 451

row_number() over()函数和with as

做个笔记 row_number() over(partition by 分组列 order by 排序列 desc) SELECT * FROM (SELECT T.*, ROW_NUMBER() OVER(PARTITION BY T.deviceid ORDER BY T.itime DESC) FLAG FROM ta_ad_ifs_log T where T.adid=35680 and T.itype = 3) TMP WHERE TMP.F

weixin_43261136的博客 465

银河麒麟服务器操作系统V10 SP1:跨架构激活与设备更换无忧指南

本文详细解析了银河麒麟服务器操作系统V10 SP1的跨架构激活新特性。该特性彻底解除了授权与CPU架构的绑定,允许同一份授权在x86、ARM、龙芯等不同架构服务器间灵活使用。文章提供了从新设备激活到硬件更换后保持激活状态的全流程实战指南,并分享了内网环境部署等高级技巧,助力企业简化运维、提升硬件资源管理灵活性。

ff678的博客 351

数据中台sql编写总结

Sql的case when 语法 1. case when 语法 CASE WHEN ElM_C_ACT >= ELM_C_MIN AND ElM_C_ACT <= ELM_C_MAX THEN '3' WHEN ElM_C_ACT < ELM_C_MIN AND ElM_C_ACT >= ELM_C_MINL THEN '2' WHEN ElM_C_ACT < ELM_C_MINL THEN '1' WHEN ElM_C_AC

qq_17023977的博客 2848

【系统架构设计师】2025年下半年真题论文回忆版及写作要点

本文摘要围绕云原生数据库、性能测试、无服务器架构和秒杀场景等关键技术进行论述。云原生数据库通过容器化、微服务和自动化运维实现弹性扩展;性能测试需要规划测试场景并关注响应时间等关键指标;无服务器架构以事件驱动为核心,简化开发流程;秒杀场景需组合运用扩容、缓存、限流等技术应对高并发。这些技术方案为构建现代高可用系统提供了重要参考。

数据知道的博客 6157

RFSoC全面解析(八)—— ZCU111 RFSoC评估工具的上位机界面

下面的内容的参考文献为:XILINX公司文档UG1287。 XILINX公司提供了一个RFSoC的ADC/DAC性能的评估工具或者叫评估系统,这个文档就是讲如何使用这个评估工具的。 整个评估系统总的框图如上图所示,评估系统由上位机、ZCU111开发板、子卡以及网线、射频线缆组成。 ZCU111开发板内主要使用的RFSoC外设为时钟驱动和DDR4,RFSoC的PS部分和PL部分都使用了。 PS部分发挥的功能为通过网口与上位机通信,通过IIC总线控制时钟驱动芯片以及数据流控制等;PL部分发挥的功能为

4381

SQL中row_number函数用法

row_number函数用法1、函数讲解2、LeetCode实战 1、函数讲解 语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) 简单的说,row_number()从1开始,为每条分组记录返回一个数字,举例: ROW_NUMBER() OVER(ORDER BY xlh DESC) 这里的用法是先将xlh列进行降序排序,再将降序后的每条记录返回一个序号。 row_number() OVER (PARTITION BY COL1 ORDE

baidu_41797613的博客 5万+

AI测试:手把手教你用AI创建流程图「喂饭教程」

本文介绍了如何利用next-ai-draw-io开源项目,通过AI快速生成专业流程图,提升测试工作效率。该工具支持自然语言交互,兼容多种AI模型(如OpenAI、Claude等),并集成draw.io图表引擎,实现实时编辑。

blues_C的博客 758

SQL中 ROW_NUMBER 函数的用法

利用 ROW_NUMBER( ) 函数 对 某一字段进行去重处理

qq_38603049的博客 2万+

【2026年阿里巴巴集团暑期实习- 4月25日-算法岗-第二题- 矩阵计数】(题目+思路+Java&C++&Python解析+在线测试)

摘要: 给定两个非负整数序列a和b,构造n×m矩阵C,其中C[i][j]=a[i]×b[j]。统计矩阵中元素≥k的数量。解法是先对数组b排序,然后对于每个a[i],若k=0则直接累加m;若a[i]=0且k>0则跳过;否则计算需要的最小b[j]值,在排序后的b中使用二分查找确定满足条件的元素数量。时间复杂度为O((n+m)log m),空间复杂度O(1)。代码实现了排序和二分查找的高效组合。

m0_73659489的博客 65

Sqlserver2012评估期已过问题解决(启动数据库服务报错1705都是同样的问题,数据库过期未激活)

一、背景: 因为之前安装sqlserver2012忘记输入序列号,如今出现评估期已过的问题,前几天忙活半天,才解决,发现网 上叙述都非常凌乱,并且仅仅有大意,有的非常难操作。所以把我操作的过程和大家交流分享: 一定要有序列号的输入。不然会有很多其它的麻烦出现: 二、问题解决: 第一步:进入SQL2012配置工具中的安装中心。 第二步:再进入左側维护选项界面,然后选择选择版本号升级。 ...

堂前燕的博客 3267

SQL Server中row_number函数用法介绍

> - PARTITION BY子句将结果集划分为分区。 ROW_NUMBER()函数分别应用于每个分区,并重新初始化每个分区的行号。 > - PARTITION BY子句是可选的。如果未指定,ROW_NUMBER()函数会将整个结果集视为单个分区。 > - ORDER BY子句定义结果集的每个分区中的行的逻辑顺序。 **ORDER BY子句是必需的**,因为ROW_NUMBER()函数对顺序敏感

Java修炼记 2万+

【学习系列】SAP RAP 17:RAP应用部署集成至Fiori Launchpad 【S4HC Public Edition】

本文详细介绍了在SAP S/4HANA Cloud环境中部署RAP应用集成到Fiori Launchpad的两种方法:使用BAS(SAP Business Application Studio)和VSCode。主要步骤包括:1)在BTP中配置Destination连接ES环境;2)设置信任关系;3)创建BAS开发空间;4)通过Fiori应用生成器部署RAP应用;5)创建IAM App、Business Catalog和Business Role;6)配置Launchpad Space和Pages。文章还提供

DeveloperMrMeng的博客 962

【MySQL】WITH AS 用法以及 ROW_NUMBER 函数 和 自增ID 的巧用

MySQL 中 WITH AS 用法以及 ROW_NUMBER 函数 和 自增ID 的巧用

weixin_50223520的博客 1466

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

sql row_number 用法

row_number 语句可将select的语句按某一列排序并赋予其连续的编号,示例如下: 语法:ROW_NUMBER () OVER ([ <partition_by_clause> ] <order_by_clause>) 。 备注:ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。 参数:<partition_by_claus...

weixin_44595372的博客 7396

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

SQL Server中row_number

1 语法格式 row_number() over(partition by 分组列 order by排序列 desc) 2 功能 简单的说row_number()从1开始,为每一条分组记录返回一个数字,同时over()里头的分组以及排序的执行晚于 where 、group by、 order by 的执行 例如:row_number() over(partition by ...

dalang_1234的专栏 1471

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ROW_NUMBER()用法 (with as + ROW_NUMBER())

ROW_NUMBER()用法   ROW_NUMBER()   说明:返回结果集分区内行的序列号,每个分区的第一行从 1 开始。  语法:ROW_NUMBER () OVER ( [ ] ) 。  备注:ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。  参数: :将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。

htkycat的专栏 516

Flink Table & SQL ROW_NUMBER Deduplication

在Flink SQL中用ROW_NUMBER进行去重操作。 语法 SELECT [column_list] FROM ( SELECT [column_list], ROW_NUMBER() OVER ([PARTITION BY col1[, col2...]] ORDER BY time_attr_col [asc|desc]) AS rownum FROM...

王佩的优快云博客 8836

SQL 中的 ROW_NUMBER() 窗口函数使用介绍

ROW_NUMBER() 是一个窗口函数,它为结果集中的每一行分配一个唯一的、连续的整数序号,从 1 开始。 它的核心特点是:序号是根据指定的 ORDER BY 子句在窗口内的排序顺序生成的。

JAVA领域优质创作者,基于分片网络查询方法专利发明者。 1777

sql之Row_Number()

一、概念 为结果集的分区中的每一行分配一个连续的整数,行号以每个分区中第一行的行号开头。 语法: ROW_NUMBER() OVER ( [PARTITION BY partition_expression,...] ORDER BY sort_expression [ASC| DESC],.. ) PARTITION BY 子句将结果集化为分区。ROW_NUMBER()函数分别应用于...

hhhhhhenrik的博客 594

实战笔记--SQL Server临时表、With As、Row_Number和游标的综合使用

学更好的别人,做更好的自己。——《微卡智享》本文长度为3314字,预计阅读9分钟前言做运维的同学都应该了解,现在运维,特别是查数据时,直接用SQL写报表要比开发个程序要快的多,这篇也是因为...

Vaccae的博客 1341

mysql排名函数row_number()over(order by)和with * as 的用法

定义:WITH 子句是 MySQL 中的一种 SQL 结构,又称为 Common Table Expression (CTE)。它在不影响原有 SQL 语句的情况下,允许开发人员临时创建一个内存中的结果集,然后对其进行操作。语法:WITH cte_name (column_name1, column_name2, …column_name1、column_name2 等是结果集的列名;每日人流量信息被记录在这三列信息中:序号 (id)、日期 (visit_date)、 人流量 (people)

騒周的博客 3万+

【SQL】With as 与row number()实现分页查询的sql语句

做ITOO系统的时候每次写分页都是直接调底层的方法就可以了,但是在一个新的系统中,自己写一个分页的表格,就不是那么的信手拈来了。下面介绍mvc分页查询

颗粒归仓 3488

ROW_NUMBER()的用法

今天在博客园上看到一篇关于ROW_NUMBER()的用法,觉得分析的挺透彻,就C过来了,分享一下哈! ROW_NUMBER() 说明:返回结果集分区内行的序列号,每个分区的第一行从 1 开始。 语法:ROW_NUMBER () OVER ([ ]order_by_clause> ) 。 备注:ORDERBY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。 参数

2万+

ROW_NUMBER() Function——SQL

ROW_NUMBER()`函数是在 SQL 中用来为结果集中的行生成一个序号(行号)的窗口函数(`window function`)。 通常结合窗口(window)的概念使用,可以用来排序和分配唯一的行号给查询结果中的每一行。

喻师傅的学习笔记 867

ROW_NUMBER和WITH 用法

ROW_NUMBER返回结果集分区内行的序列号,每个分区的第一行从 1 开始。 语法ROW_NUMBER ( )     OVER ( [ ] ) 备注ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。 参数 将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。  确定将 ROW_NUMBER 值

play7788的专栏 713
上一篇: sql语法 DECODE, CASE ... WHEN
下一篇: SQL语法 NVL,COALESCE
han_hanker
博客等级 码龄13年 35粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值