一、任務描述
如圖,要查詢同一個客戶(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: