데이터 준비
-- T_CUS_LGN 테이블 생성 및 테스트 데이터 입력
CREATE TABLE T_CUS_LGN
(
CUS_ID VARCHAR2(40) NOT NULL,
LGN_DT DATE NOT NULL,
SUC_YN VARCHAR2(40) NULL,
LGN_FAL_CD VARCHAR2(40) NULL
);
CREATE UNIQUE INDEX PK_T_CUS_LGN ON T_CUS_LGN(CUS_ID, LGN_DT);
ALTER TABLE T_CUS_LGN
ADD CONSTRAINT PK_T_CUS_LGN PRIMARY KEY(CUS_ID, LGN_DT) USING INDEX;
INSERT INTO T_CUS_LGN (CUS_ID ,LGN_DT ,SUC_YN ,LGN_FAL_CD)
SELECT T1.CUS_ID ,T2.LGN_DT
,CASE WHEN T1.CUS_ID = 'CUS_0001' AND RNO >= 4998 THEN 'N' ELSE 'Y' END SUC_YN
,CASE WHEN T1.CUS_ID = 'CUS_0001' AND RNO >= 4998 THEN 'PW.WRONG' ELSE NULL END LGN_FAL_CD
FROM M_CUS T1
,( SELECT TO_DATE('20170301','YYYYMMDD') + (ROWNUM / 24 / 60 / 30) LGN_DT
,ROWNUM RNO
FROM DUAL A CONNECT BY ROWNUM <= 5000
) T2;
최근 로그인 세번 : TOP-N쿼리실패했는지 : 최종필터결과는 올바르나 성능이 좋지 못한 예
-- 로그인 연속 실패 카운트 – 좋지 못한 방법
SELECT COUNT(*)
FROM T_CUS_LGN T1
WHERE T1.LGN_DT > (
SELECT MAX(T1.LGN_DT) LAST_SUC_DT
FROM T_CUS_LGN T1
WHERE T1.CUS_ID = 'CUS_0001'
AND T1.SUC_YN = 'Y')
AND T1.CUS_ID = 'CUS_0001'
AND T1.SUC_YN = 'N';
좋은 예