Group by 할 때 그룹 별 마지막 항목을 제거하고 싶습니다. 0 6 2,339

by 박천주 group by [2014.09.15 11:51:59]


preredial.png (19,111Bytes)

# 읽어 주셔서 정말 너무 감사합니다.

# 작은 도움이라도 너무 너무 감사합니다.

 

(파일첨부) Order by DT desc, DN asc 으로 정렬 했습니다.

Group by 대상은 [ DN ] 입니다.

[ DN ]으로 묶은 후에 조건을 주고 싶습니다. (having)

 

1. Count( [DN] ) > 1 조건으로 2개 이상인 레코드만 선택 한다.

2. Group by [DN] 별로 마지막 날짜를 제거한다.

 

2가지 조건을 걸고 싶었는데.. 1번 하나만은 having count( DN ) > 1 이렇게 하니까 잘 됩니다.

2번 조건에서 진척이 없어.. 이렇게 도움을 청합니다.

 

by 마농 [2014.09.15 13:22:32]

1. Count( [DN] ) > 1 조건으로 2개 이상인 레코드만 선택 한다.
  - 굳이 컬럼을 명시해서 카운트할 필요 없습니다.
  - 그냥 COUNT(*) 하는 것이 성능 상으로도 좋습니다.
2. Group by [DN] 별로 마지막 날짜를 제거한다.???
  - [마지막 날짜를 제거] 표현이 모호합니다.
  - 데이터 삭제(Delete)를 의미하는지?
  - 조회(Select) 대상에서 제외(Where)하는 것을 의미하는지?


by 박천주 [2014.09.15 13:39:24]

Where 조건 대상에서 제외 하는 것입니다.

그룹별로 마지막 날짜를 빼고 Select 하고 싶은 겁니다.

Count(*) 이 더 빠른처리가 되는군요 감사합니다.


by 마농 [2014.09.15 13:49:41]
SELECT id, dn, cd, dt
  FROM (SELECT id, dn, cd, dt
             , ROW_NUMBER() OVER(PARTITION BY dn ORDER BY dt DESC) rn
             , COUNT(*) OVER(PARTITION BY dn) cnt
          FROM t
        )
 WHERE cnt >= 2
   AND rn  != 1
;

 


by 박천주 [2014.09.15 14:17:45]

O.. M.. G.. !! 바로 이거에요!!

 

저는 같은 테이블 left join not in 걸어서

group by 별 max date 를 제거하는 쪽으로 생각 했는데,

 

훨씬 간결하네요. 정말 감사합니다 !


by 마농 [2014.09.15 14:33:34]
-- 네. 분석함수 사용하지 못한다면 그렇게 하는게 맞습니다.
-- 단, Not In 보다는 조인을 이용하시는게 좋습니다.
SELECT a.*
  FROM t a
     , (SELECT dn
             , MAX(dt) dt
          FROM t
         GROUP BY dn
         HAVING COUNT(*) > 1
        ) b
 WHERE a.dn = b.dn
   AND a.dt < b.dt
;

 


by 박천주 [2014.09.15 15:09:37]

덕분에 정말 잘 해결했습니다.

너무너무 감사합니다 !

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