【Orcale】分析函数 OVER(PARTITION BY... ORDER BY...)的讲解

OVER(PARTITION BY... ORDER BY...)的使用说明和意义

这个函数长这个样子:OVER(PARTITION BY... ORDER BY...)

顾名思义,PARTITION 中文是分割的意思,ORDER 是排序的意思,所以翻译一下就是先把一组数据按照制定的字段进行分割成各种组,然后组内按照某个字段排序。

以实际案例来说明这个函数的使用,

首先,我们先看一组普通排序的数据:

然后对其进行新加一个伪劣ROWNUM,看看数据原本的顺序:

OVER(ORDER BY ...)的意思是以按照某个字段排序,所以和直接对表的order by效果是一样的:

这里就显示了OVER(ORDER BY ...)的第一个功能,就是对新查询得到的数据进行重新编号,即RNO的值,由于这里没有PARTITION BY...,所以可以比作整个列就是一个大块,然后对大块的内容进行排序,这个时候再加上PARTITION BY...,查询结果:

它会按照制定的字段,把相同值的排在一起,分为一个块,也就是分组,然后组内排序编号,这样你就可以取不同组内的任意第几个值,类似于TOP-N的分析。

在这里over之前使用的函数是ROW_NUMBER(),就是对数据的编号。

 

与OVER(PARTITION BY... ORDER BY...)匹配使用的函数

row_number() over()、rank() over()和dense_rank() over()

在上面的例子里,使用ROW_NUMBER()可以对数据编号,但是有一个问题,例子中的MI_ID是不可以重复的,如果在可以重复的情况下,就有并列的情况,这样就无法取出并列的数据,只能取单一排序的数据。所以这里可以换成 rank() over()和dense_rank() over()来进行编号:(rank() over()和dense_rank() over()的区别如图)

sum() over(),first_value() over()和last_value() over()的使用

sum() over()分组求和

first_value() over()求分组第一条

last_value() over()求分组最后一条

其中用row_number() over()取编号第一条的也可以实现first_value() over()的效果

 

SELECT DISTINCT *
  FROM (SELECT T1.MI_ID,
               T3.I_IDENTITY_CARD,
               SUM(NVL(T2.IS_VISHEARTPROMEMBER, 0)) OVER(PARTITION BY T3.I_IDENTITY_CARD) PRO_NUM,
               SUM(NVL(T2.IS_VISHEARTEXPMEMBER, 0)) OVER(PARTITION BY T3.I_IDENTITY_CARD) EXP_NUM,
               SUM(NVL(T2.IS_VISHEARTPOLMEMBER, 0)) OVER(PARTITION BY T3.I_IDENTITY_CARD) POL_NUM,
							 T1.CREATE_TIME,
               FIRST_VALUE(T2.CREATE_DATE) OVER(PARTITION BY T3.I_IDENTITY_CARD ORDER BY T2.CREATE_DATE DESC) FIRST_CREATE_DATE
          FROM T_ZZ_PETITIONERS T1
          LEFT JOIN T_ZZ_VISIT_RECORD T2
            ON T1.CI_RS_ID = T2.CI_RS_ID
           AND T2.STATUS != '003'
          LEFT JOIN T_DC_CI_RS_TOP T3
            ON T1.CI_RS_ID = T3.CI_RS_ID
           AND T3.STATUS = '1'
         WHERE T1.IS_ADD_HEARTPROTECT = '1'
           AND T1.STATUS = '1') C
 ORDER BY C.CREATE_TIME DESC
FIRST_VALUE(T2.CREATE_DATE) OVER(PARTITION BY T3.I_IDENTITY_CARD ORDER BY T2.CREATE_DATE DESC) FIRST_CREATE_DATE
          FROM T_ZZ_PETITIONERS T1
          LEFT JOIN T_ZZ_VISIT_RECORD T2
            ON T1.CI_RS_ID = T2.CI_RS_ID
           AND T2.STATUS != '003'
          LEFT JOIN T_DC_CI_RS_TOP T3
            ON T1.CI_RS_ID = T3.CI_RS_ID
           AND T3.STATUS = '1'
         WHERE T1.IS_ADD_HEARTPROTECT = '1'
           AND T1.STATUS = '1') C
 ORDER BY C.CREATE_TIME DESC


 

 

 

 

SELECT *
  FROM (SELECT T1.MI_ID,
               T3.I_IDENTITY_CARD,
               SUM(NVL(T2.IS_VISHEARTPROMEMBER, 0)) OVER(PARTITION BY T3.I_IDENTITY_CARD) PRO_NUM,
               SUM(NVL(T2.IS_VISHEARTEXPMEMBER, 0)) OVER(PARTITION BY T3.I_IDENTITY_CARD) EXP_NUM,
               SUM(NVL(T2.IS_VISHEARTPOLMEMBER, 0)) OVER(PARTITION BY T3.I_IDENTITY_CARD) POL_NUM,
               T1.CREATE_TIME,
               ROW_NUMBER() OVER(PARTITION BY T3.I_IDENTITY_CARD ORDER BY T2.CREATE_DATE DESC) RNO
          FROM T_ZZ_PETITIONERS T1
          LEFT JOIN T_ZZ_VISIT_RECORD T2
            ON T1.CI_RS_ID = T2.CI_RS_ID
           AND T2.STATUS != '003'
          LEFT JOIN T_DC_CI_RS_TOP T3
            ON T1.CI_RS_ID = T3.CI_RS_ID
          LEFT JOIN T_DC_GRID T4
            ON T1.REGION_CODE = T4.INFO_ORG_CODE
         WHERE T1.IS_ADD_HEARTPROTECT = '1'
           AND T1.STATUS = '1'
           AND T3.STATUS = '1'
           AND T4.STATUS = '001') C
 WHERE C.RNO = 1
 ORDER BY C.CREATE_TIME DESC
ROW_NUMBER() OVER(PARTITION BY T3.I_IDENTITY_CARD ORDER BY T2.CREATE_DATE DESC) RNO
          FROM T_ZZ_PETITIONERS T1
          LEFT JOIN T_ZZ_VISIT_RECORD T2
            ON T1.CI_RS_ID = T2.CI_RS_ID
           AND T2.STATUS != '003'
          LEFT JOIN T_DC_CI_RS_TOP T3
            ON T1.CI_RS_ID = T3.CI_RS_ID
          LEFT JOIN T_DC_GRID T4
            ON T1.REGION_CODE = T4.INFO_ORG_CODE
         WHERE T1.IS_ADD_HEARTPROTECT = '1'
           AND T1.STATUS = '1'
           AND T3.STATUS = '1'
           AND T4.STATUS = '001') C
 WHERE C.RNO = 1
 ORDER BY C.CREATE_TIME DESC


 

 

 

ignore nulls:过滤掉空值

 

常用的分析函数如下所列:

row_number() over(partition by ... order by ...)
rank() over(partition by ... order by ...)
dense_rank() over(partition by ... order by ...)
count() over(partition by ... order by ...)
max() over(partition by ... order by ...)
min() over(partition by ... order by ...)
sum() over(partition by ... order by ...)
avg() over(partition by ... order by ...)
first_value() over(partition by ... order by ...)
last_value() over(partition by ... order by ...)
lag() over(partition by ... order by ...)
lead() over(partition by ... order by ...)

 

 

 

 

 

### 关于面包板电源模块 MB102 的 USB 供电规格及兼容性 #### 1. **MB102 基本功能** 面包板电源模块 MB102 是一种常见的实验工具,主要用于为基于面包板的小型电子项目提供稳定的电压输出。它通常具有两路独立的稳压输出:一路为 5V 和另一路可调电压(一般范围为 3V 至 12V)。这种设计使得它可以满足多种芯片和传感器的不同工作电压需求。 #### 2. **USB 供电方式** MB102 支持通过 USB 接口供电,输入电压通常是标准的 5V DC[^1]。由于其内部集成了 LM7805 稳压器以及可调节电位器控制的直流-直流变换电路,因此即使输入来自电脑或其他低功率 USB 设备,也能稳定地向负载供应电力。不过需要注意的是,如果项目的功耗较高,则可能超出某些 USB 端口的最大电流能力(一般是 500mA),从而引起不稳定现象或者保护机制启动断开连接的情况发生。 #### 3. **兼容性分析** 该型号广泛适用于各种微控制器单元 (MCU),特别是那些像 Wemos D1 R32 这样可以通过杜邦线轻松接入并共享相同逻辑级别的系统[^2]。另外,在提到 Arduino Uno 板时也表明了良好的互操作性,因为两者均采用相似的标准接口定义与电气特性参数设置[^4]: - 对于需要 3.3V 工作环境下的组件来说,只需调整好对应跳线帽位置即可实现精准匹配; - 当涉及到更多外围扩展应用场合下,例如带有多重模拟信号采集任务的情形里,利用 MB102 提供干净无干扰的基础能源供给就显得尤为重要了[^3]。 综上所述,对于打算构建以单片机为核心的原型验证平台而言,选用具备良好声誉记录且易于获取配件支持服务链路上下游资源丰富的品牌产品——如这里讨论过的这款特定类型的配电装置不失为明智之举之一。 ```python # 示例 Python 代码展示如何检测硬件状态 import machine pin = machine.Pin(2, machine.Pin.IN) if pin.value() == 1: print("Power supply is stable.") else: print("Check your connections and power source.") ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值