partition by와 group by
오늘도 쿼리 문제다~ ㅎㅎ..
그룹을 지어서 select문을 보여줘야했는데,
내가 원하는 대로 결과가 나오지 않았다!
찾아보니 group by만 그룹별로 묶어주는 것이 아니었다!
GROUP BY가 가장 널리 쓰이는(?) 그룹 함수일 것이다.
신나게 사용하고 쿼리를 돌려보니…
있어야 할 데이터가 없는 경우가 생겨났다.
오잉 왜 그러지…?!?!?!?!
GROUP BY는 그룹 외부에서 묶어서 순위 및 그룹별 집계를 구할 때 사용하는데,
특정 원하는 컬럼에 대해 추출하여 결과값을 보여준다.
이게 무슨 소리인고 하니…
group by id 로 묶을 때, id는 같지만 다른 컬럼의 데이터는 다른 경우에도
무조건 대표 데이터 하나만 남기고 나머지는 추출하지 않는다는 것이다!
그랬기 때문에, 내가 쿼리를 돌렸을 때 원하는 데이터가 다 나오지 않는 것이었다…ㅠㅠ…
그렇다면 나는 어떤 그룹함수를 써야하는가….!!!
찾아보니 PARTITIN BY 라는 함수가 존재했다.
PARTITIN BY는 그룹 내 순위 및 그룹별 집계를 구할 때 사용하는데,
전체 데이터에서 원하는 결과값을 보여준다.
한마디로! 데이터를 다 보여준다~
select id, post_yn
from cts_notice cn
group by post_yn
-------------------------------
id | post_yn
1670700756799877121 | Y
1699227275172093954 | N
select id, post_yn, count(*) over(partition by post_yn)
from cts_notice cn
-------------------------------
id | post_yn | count(*) over(partition by post_yn)
1699227275172093954 | N | 1
1670700756799877121 | Y | 4
1671068407352676354 | Y | 4
1671081956220907522 | Y | 4
1678307101468327937 | Y | 4
두 쿼리문을 비교해보면 결과가 다른 것을 볼 수 있다!
PARTITIN BY를 이용하면 모든 데이터를 group 별로 묶어서 볼 수 있다.
근데 한가지 문제가 있는데…
PARTITIN BY를 사용할 때는 통계나 집계함수와 함께 써야한다는 것이다.
보통 group by는 통계함수 사용시 많이 사용하는 편이어서 큰 문제는 없지만,
가끔 필요 없을 때가 있어서 거슬리기는 하다…ㅠㅠ
적절히 잘 사용하면 될 것 같다..!
SK 프로젝트를 진행하면서 쿼리와 진짜 많이 싸우는 것 같다…ㅠㅠ
PL님이 내 능력향상을 위해서 조금 어려운 것들을 많이 주시기 때문인데…
처음에는 힘들고 스트레스를 많이 받았지만,
결국에 나한테는 뼈가 되고 살이 되는 것들이기 때문에 최대한 긍정적으로 하려고 노력중이다.
새로운 것들도 많이 알아가고 쿼리에 대해서 좀 더 깊게 볼 수 있음에 감사하다.
근데 너무 부족한 것 같다^^….
쿼리 공부도 열심히 해야할 듯 싶다… 흑흑… ㅠㅠ