Oracle分析函数

发布于:2024-03-21 ⋅ 阅读:(62) ⋅ 点赞:(0)

自己理解的使用背景:

只需要表中或者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

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到