그룹별 이중조건처리 0 5 1,335

by 통합문서 [SQL Query] [2016.04.19 17:22:02]


SEQ

LIMIT ORDER VAL
ID001 N 1 1
ID001 Y 3 2
ID001 N 4 3
ID001 Y 3 4
ID001 N 1 5
ID002 N 4 1
ID002 Y 2 2
ID002 Y 2 3
ID002 N 1 4
ID002 N 4 5

ID001, ID002 별로 그룹바이하여 LIMIT값이 Y인 값의 ORDER값보다 작은것들 중에서 VAL값이 최소값인것을 찾아야 하는데 잘안되네요.. ㅜ

설명드리자면 ID001을 기준으로 LIMIT가 'Y'인 놈을 찾으면 일단 두ROW가 나오게되고

ID001 Y 3 2 / ID001 Y 3 4 해당ROW의 ORDER값 3 보다 작은놈을 찾습니다.

LIMIT='Y' 인 ROW의 ORDER값은 항상 동일합니다.

그럼 ID001 N 1 1 / ID001 N 1 5 ROW가 나오게되고 이중에서 VAL값이 작은 ID001 N 1 1의 값이 최종 선택됩니다.

[결과]

ID001 N 1 1
ID002 N 1 4

두ROW중 VAL값이 작은 ROW.. <--- 이조건은 삭제합니다.

ID001 N 1 1
by 마농 [2016.04.19 17:30:10]

Y 인게 2건 있네요.
  - 예시에서는 2건의 order 가 동일한데... 다른 경우는 없나요? 다른 경우 어떻게?
최소값이 1건 나왔네요
  - 최소값이 동일한게 2건 이상 나오면 어떻게?
이런류의 정렬 문제에서는
  - 중복 건에 대한 고려도 해줘야 하고
  - 정렬기준을 명확하게 제시해 주셔야 합니다.


by 통합문서 [2016.04.19 17:35:55]

네네 마농님, order가 다른경우는 없습니다.

limit가 'Y'인 값의 order는 동일합니다.

ID별 최소값까지만 구하면 될것같습니다. ㅜ


by 마농 [2016.04.19 17:56:05]
WITH t AS
(
SELECT 'ID001' seq, 'N' lmt, 1 ord, 1 val FROM dual
UNION ALL SELECT 'ID001', 'Y', 3, 2 FROM dual
UNION ALL SELECT 'ID001', 'N', 4, 3 FROM dual
UNION ALL SELECT 'ID001', 'Y', 3, 4 FROM dual
UNION ALL SELECT 'ID001', 'N', 1, 5 FROM dual
UNION ALL SELECT 'ID002', 'N', 4, 1 FROM dual
UNION ALL SELECT 'ID002', 'Y', 2, 2 FROM dual
UNION ALL SELECT 'ID002', 'Y', 2, 3 FROM dual
UNION ALL SELECT 'ID002', 'N', 1, 4 FROM dual
UNION ALL SELECT 'ID002', 'N', 4, 5 FROM dual
)
SELECT seq, lmt, ord, val
  FROM (SELECT seq, lmt, ord, val
             , RANK() OVER(PARTITION BY seq ORDER BY val) rk
          FROM (SELECT seq, lmt, ord, val
                     , MIN(DECODE(lmt, 'Y', ord)) OVER(PARTITION BY seq) ord_min_y
                  FROM t
                )
         WHERE ord < ord_min_y
        )
 WHERE rk = 1
;

 


by 통합문서 [2016.04.19 18:05:58]

후아.. 감탄할따름입니다.;!!(__)

혹시 RANK OVER 사용안하고 할수는 없는거죠??ㅎㅎ;

감사합니다!

 


by 창조의날개 [2016.04.19 18:12:06]

WITH TT(SEQ, LIMIT, "ORDER", VAL) AS (
    SELECT 'ID001',	'N',	1,	1 FROM DUAL UNION ALL
    SELECT 'ID001',	'Y',	3,	2 FROM DUAL UNION ALL
    SELECT 'ID001',	'N',	4,	3 FROM DUAL UNION ALL
    SELECT 'ID001',	'Y',	3,	4 FROM DUAL UNION ALL
    SELECT 'ID001',	'N',	1,	5 FROM DUAL UNION ALL
    SELECT 'ID002',	'N',	4,	1 FROM DUAL UNION ALL
    SELECT 'ID002',	'Y',	2,	2 FROM DUAL UNION ALL
    SELECT 'ID002',	'Y',	2,	3 FROM DUAL UNION ALL
    SELECT 'ID002',	'N',	1,	4 FROM DUAL UNION ALL
    SELECT 'ID002',	'N',	4,	5 FROM DUAL
)
SELECT SEQ, LIMIT, "ORDER", VAL
FROM (
      SELECT AA.SEQ, AA.LIMIT, AA."ORDER", AA.VAL
           , ROW_NUMBER () OVER (PARTITION BY AA.SEQ ORDER BY AA.VAL) RN
      FROM TT AA
        , (SELECT DISTINCT SEQ, "ORDER"
           FROM TT
           WHERE LIMIT = 'Y') BB
      WHERE AA.SEQ = BB.SEQ
        AND AA."ORDER" < BB."ORDER"
      )
WHERE RN = 1
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입