Oracle 统计分析函数使用示例

1.使用  listagg() WITHIN GROUP ()  将多行字段合并成一行

--LISTAGG() WITHIN GROUP()函数的使用
SELECT A.ID                       AS "ID",
       A.SECURITY_CODE            AS "SECURITYCODE",
       A.SECURITY_CODE_CHECK_FLAG AS "SECCODECHECKFLAG",
       A.CUSTOMER_CODE            AS "CUSTOMERCODE",
       A.REDCODE                  AS "REDCODE",
       A.OPENID,
       A.SCAN_ID                  AS "RPREDCODESCAN",
       A.APPROVAL_TYPE            AS "APPROVALTYPE",
       A.STATE                    AS "STATE",
       A.FIRST_REVIEWER           AS "FIRSTREVIEWER",
       A.FIRST_LIMIT_DATE         AS "FIRSTLIMITDATE",
       A.FIRST_HANDLE_DATE        AS "FIRSTHANDLEDATE",
       A.FIRST_OVERTIME           AS "FIRSTOVERTIME",
       A.FIRST_HANDLE_BY          AS "FIRSTHANDLEBY",
       /*A.FIRST_HANDLER_NAME AS "FIRSTHANDLERNAME",*/
       A.FIRST_OPINION      AS "FIRSTOPINION",
       A.SECOND_REVIEWER    AS "SECONDREVIEWER",
       A.SECOND_LIMIT_DATE  AS "SECONDLIMITDATE",
       A.SECOND_HANDLE_DATE AS "SECONDHANDLEDATE",
       A.SECOND_OVERTIME    AS "SECONDOVERTIME",
       A.SECOND_HANDLE_BY   AS "SECONDHANDLEBY",
       /* A.SECOND_HANDLER_NAME AS "SECONDHANDLERNAME",*/
       A.SECOND_OPINION      AS "SECONDOPINION",
       A.FEEDBACK_ID         AS "FEEDBACK.ID",
       A.PROC_INS_ID         AS "PROCINSID",
       A.CREATE_DATE         AS "CREATEDATE",
       A.CREATE_BY           AS "CREATEBY.ID",
       A.UPDATE_BY           AS "UPDATEBY.ID",
       A.UPDATE_DATE         AS "UPDATEDATE",
       A.DEL_FLAG            AS "DELFLAG",
       A.REMARKS             AS "REMARKS",
       B.USER_NAME           AS "FEEDBACK.USERNAME",
       B.MOBILE              AS "FEEDBACK.MOBILE",
       B.SELLER_NAME         AS "FEEDBACK.SELLERNAME",
       B.FANGWEI_LABEL_PHOTO AS "FEEDBACK.FANGWEILABELPHOTO",
       B.UPLOAD_PHOTO_TWO    AS "FEEDBACK.UPLOADPHOTOTWO",
       B.UPLOAD_PHOTO_THREE  AS "FEEDBACK.UPLOADPHOTOTHREE",
       C.NICK_NAME           AS "FEEDBACK.FOCUSUSER.NICKNAME",
       C.HEAHIMGURL          AS "FEEDBACK.FOCUSUSER.HEAHIMGURL",
       D.UPDATE_DATE         AS "RPREDCODESCAN.UPDATEDATE",
       D.ADDR                AS "RPREDCODESCAN.ADDR",
       D.PROVINCEVAL         AS "RPREDCODESCAN.PROVINCEVAL",
       D.CITYVAL             AS "RPREDCODESCAN.CITYVAL",
       E.MATERIAL_CODE       AS "MATERIAL.MATERIALCODE",
       E.MATERIAL_NAME       AS "MATERIAL.MATERIALNAME",
       G.NAME                AS "CUSTOMERNAME",
       M.CURRENTTODO         AS "CURRENTTODO"
  FROM RP_APPROVAL_PROCESS A
  LEFT JOIN RP_FOCUS_USER C
    ON A.OPENID = C.OPEN_ID
  LEFT JOIN MATERIAL E
    ON A.SECURITY_CODE = E.W_ID
  LEFT JOIN BP_DEALER_RP G
    ON A.CUSTOMER_CODE = G.DEAL_CODE, RP_APPROVAL_FEEDBACK B,
 RP_REDCODE_SCAN D, (SELECT T.ID,
               LISTAGG(T.USER_NAME, ',') WITHIN GROUP(ORDER BY T.ID) CURRENTTODO
          FROM (SELECT I.USER_NAME, P.ID
                
                  FROM RP_APPROVAL_PROCESS P
                  LEFT JOIN ACT_RU_TASK H
                    ON P.PROC_INS_ID = H.PROC_INST_ID_
                  LEFT JOIN RP_USER_REGISTER I
                    ON I.PHONE_NUMBER = H.ASSIGNEE_
                 ORDER BY P.ID DESC) T
         GROUP BY T.ID) M
 WHERE M.ID = A.ID
   AND A.FEEDBACK_ID = B.ID
   AND A.SCAN_ID = D.ID;
SELECT DISTINCT (REORDER(P_SRC_STR => T.VENDOR_CODES)) GS_NAME_PATH,
                T.VEN_CNT
  FROM (SELECT PN.GS_NAME_PATH || '@' || LISTAGG(PN.VENDOR_CODE, '@') WITHIN GROUP(ORDER BY PN.VENDOR_CODE) VENDOR_CODES,
               PN.VEN_CNT + 5 VEN_CNT
          FROM PV_NCAL PN
         WHERE PN.VEN_CNT > 1
         GROUP BY PN.GS_NAME_PATH || '@', PN.VEN_CNT) T;

2.lead() over()分析函数的用法总结(查询当前行向下偏移n行对应的结果)

--lead() over()分析函数的用法总结
SELECT *
  FROM (SELECT (T1.NEXT_RECORD_START_DATE - T1.END_DATE) DATE_DIFF,
               T1.NEXT_RECORD_END_DATE,
               T1.NEXT_RECORD_START_DATE,
               T1.END_DATE
          FROM (SELECT T.START_DATE,
                       T.END_DATE,
                       LEAD(T.START_DATE,
                            1,
                            TO_DATE('2019-07-15', 'YYYY-MM-DD')) OVER(ORDER BY T.START_DATE) NEXT_RECORD_START_DATE,
                       LEAD(T.END_DATE,
                            1,
                            TO_DATE('2019-07-15', 'YYYY-MM-DD')) OVER(ORDER BY T.START_DATE) NEXT_RECORD_END_DATE
                  FROM WORK_TIME_RANGE T
                 WHERE T.ID = 0
                   AND T.END_DATE IS NOT NULL
                 ORDER BY T.START_DATE) T1) T2
 WHERE T2.NEXT_RECORD_START_DATE IS NULL
    OR T2.DATE_DIFF > 1;

3.lag() over()分析函数的用法总结(查询当前行向上偏移n行对应的结果)

SELECT *
  FROM (SELECT (T1.NEXT_RECORD_START_DATE - T1.END_DATE) DATE_DIFF,
               T1.NEXT_RECORD_END_DATE,
               T1.NEXT_RECORD_START_DATE,
               T1.END_DATE
          FROM (SELECT T.START_DATE, T.END_DATE, lag(T.START_DATE, 1) OVER(ORDER BY T.START_DATE) NEXT_RECORD_START_DATE,
               LEAD(T.END_DATE, 1) OVER(ORDER BY T.START_DATE) NEXT_RECORD_END_DATE
          FROM WORK_TIME_RANGE T
         WHERE T.ID = 0
           AND T.END_DATE IS NOT NULL
         ORDER BY T.START_DATE) T1) T2
 WHERE T2.NEXT_RECORD_START_DATE IS NULL
    OR T2.DATE_DIFF > 1;

4.count(field) over(partition by ...)分析函数的用法总结(展示每一行中,根据VENDOR_CODE分组的数量)

--count(field) over(partition by ...)分析函数的用法总结(展示每一行中,根据VENDOR_CODE分组的数量)
	SELECT A.PROJECT_CODE,
            TO_NUMBER(A.VENDOR_CODE),
            A.VEN_CNT,
            COUNT(*) OVER(PARTITION BY PROJECT_CODE) PRO_CNT,
            VENDOR_NAME
       FROM (SELECT PROJECT_CODE,
                    VENDOR_CODE,
                    COUNT(*) OVER(PARTITION BY VENDOR_CODE) VEN_CNT,
                    VENDOR_NAME
               FROM (SELECT DISTINCT * FROM PROJECT_VENDOR)) A
      WHERE VEN_CNT > 4;

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潇潇雨歇_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值