02_窗口函數:實例學習 - 巧用ROW_NUMBER() 查詢連續出現某值的最大次數


一、任務描述

如圖,要查詢同一個客戶(USER_ID)同一賬戶(ACCT_ID)下,近12個月(MONTH_NBR)連續出現同一個狀態(FLAG:0 或 1)的最大次數。

二、任務測試過程

1. 創建測試表結構

--DROP TABLE TEST_FOR_ROW;
CREATE TABLE TEST_FOR_ROW
(
USER_ID VARCHAR(100)
,ACCT_ID VARCHAR(100)
,MONTH_NBR NUMBER(10)
,FLAG NUMBER (10)
);

2. 創建批量插入數據的存儲過程

CREATE OR REPLACE PROCEDURE PROC_TABLE_FOR_TEST_ROW AS 

NM_1 NUMBER := 1;
NM_2 NUMBER := 1;
NM_3 NUMBER := 1;

BEGIN
  NM_1 := 1;
  WHILE NM_1 <= 12 LOOP
    NM_2 := 1;
    WHILE NM_2 <= 3 LOOP
      NM_3 := 1;
      WHILE NM_3 <= 3 LOOP
        INSERT INTO TEST_FOR_ROW (USER_ID, ACCT_ID, MONTH_NBR, FLAG) VALUES('C1'||NM_3, 'A1'||NM_2, NM_1, CAST(DBMS_RANDOM.VALUE(0, 1) AS INT));
        COMMIT;
        NM_3 := NM_3 + 1;
      END LOOP;
      NM_2 := NM_2 + 1;
    END LOOP;
    NM_1 := NM_1 + 1;
  END LOOP;
  
END PROC_TABLE_FOR_TEST_ROW;

3. 執行存儲過程插入數據

BEGIN
  PROC_TABLE_FOR_TEST_ROW;
END;

4. 執行查詢語句

--step3
SELECT
  USER_ID AS USER_ID
  ,ACCT_ID AS ACCT_ID
  ,FLAG AS FLAG
  ,MAX(CONTINUE_CNT) AS MAX_CONTINUE_CNT
FROM
(
  --step2
  SELECT 
    USER_ID AS USER_ID
    ,ACCT_ID AS ACCT_ID
    ,FLAG AS FLAG
    ,NM AS NM
    ,COUNT(*) AS CONTINUE_CNT
  FROM
  (
    --step1
    SELECT
      USER_ID AS USER_ID
      ,ACCT_ID AS ACCT_ID
      ,MONTH_NBR AS MONTH_NBR
      ,FLAG AS FLAG
      ,ROW_NUMBER() OVER(PARTITION BY USER_ID, ACCT_ID ORDER BY MONTH_NBR) AS NM_1
      ,ROW_NUMBER() OVER(PARTITION BY USER_ID, ACCT_ID, FLAG ORDER BY FLAG) AS NM_2
      ,ROW_NUMBER() OVER(PARTITION BY USER_ID, ACCT_ID ORDER BY MONTH_NBR) 
      - ROW_NUMBER() OVER(PARTITION BY USER_ID, ACCT_ID, FLAG ORDER BY MONTH_NBR) AS NM
    FROM
      TEST_FOR_ROW
  )
  GROUP BY
    USER_ID
    ,ACCT_ID
    ,FLAG
    ,NM
  ORDER BY 
     USER_ID
    ,ACCT_ID
    ,NM
)
GROUP BY
  USER_ID
  ,ACCT_ID
  ,FLAG
ORDER BY 
   USER_ID
  ,ACCT_ID
  ,FLAG
;

按照以上查詢語句里的step1、step2、step3進行分步執行,如下圖:

step1:

step2:

step3:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM