Oracle分析函数

自己理解的使用背景:

只需要表中或者C#结果集中的一条数据时,往这想!!!!!!

在多表关联的SQL查询中,只需要其中一个表的特定的一条数据,可使用分析函数!!!

普通的聚合函数用group by分组,每个分组返回一个统计值;而分析函数采用partition by 分组,并且每组每行都可以返回一个统计值。

比如用group by分组后,左表是被分组了,但是导致右表的数据可能是随机的,不是想要的那个右表数据,这时候就可以用分析函数采用partition by分组

C#代码中举例:
rownum = Sql.Ext.RowNumber()
        .Over()
        .PartitionBy(p.MITEM_CODE)
        .OrderBy(p.MITEM_CODE)
        .ThenBy(p.MITEM_CODE)
        .ToValue(),
SQL举例:
WITH A AS
 (SELECT P1.ORG_ID,
         P1.EQUIPMENT_CODE,
         P1.EQUIPMENT_NAME,
         P1.AREA_CODE,
         P1.SHIFT_CODE,
         P1.EQUPMENT_OPERATION_STATUS,
         P1.PRE_OPERATION_STATUS,
         P1.STATION_CODE,
         P1.START_STANDBY_TIME,
         P1.START_RUN_TIME,
         P2.WORKSHOP_CODE,
         P2.OCCURRED_TIME AS ABNORMAL_OCCURRENCE_TIME,
         P2.INCIDENT_DETAIL AS ABNORMAL_DETAIL,
         ROW_NUMBER() OVER(PARTITION BY P1.ORG_ID, P1.EQUIPMENT_CODE, P1.EQUIPMENT_NAME, P1.AREA_CODE, P1.SHIFT_CODE, P1.EQUPMENT_OPERATION_STATUS, P1.PRE_OPERATION_STATUS, P1.STATION_CODE, P1.START_STANDBY_TIME, P1.START_RUN_TIME, P2.WORKSHOP_CODE ORDER BY P1.START_STANDBY_TIME - P2.OCCURRED_TIME ASC) AS RN
    FROM FND_EQUPMINET_OPERATION_STATUS P1
   INNER JOIN AD_INCIDENT_LOG P2
      ON (P1.EQUIPMENT_CODE = P2.EQUIPMENT_CODE)
   WHERE P1.PRE_OPERATION_STATUS IN ('1', '4')
     AND P2.EQUIPMENT_TYPE_CODE LIKE '%AUTO%'
     AND P1.START_STANDBY_TIME >= P2.OCCURRED_TIME
     AND P2.OCCURRED_TIME >= P1.START_STANDBY_TIME - INTERVAL '24' HOUR
     AND P1.ORG_ID = 'C03'
     AND P2.WORKSHOP_CODE = '1'
     AND P1.STATION_CODE IN ('KS1')
     AND P1.START_STANDBY_TIME >=
         TO_DATE('2024-03-11 08:00:00', 'yyyy-MM-dd hh24:mi:ss')
     AND P1.START_STANDBY_TIME <=
         TO_DATE('2024-03-11 10:00:00', 'yyyy-MM-dd hh24:mi:ss')
 )
SELECT *
  FROM A
 WHERE RN = 1
 ORDER BY EQUIPMENT_CODE,
          AREA_CODE,
          START_STANDBY_TIME,
          ABNORMAL_OCCURRENCE_TIME

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值