안녕하세요. 현재 쿼리를 짜고 있는데 속도가 잡히지 않아 질문 드립니다..
구하고 싶은 내용은 'DataID 별 각 Category 안에서 가장 많은 name들을 계산'하고 싶습니다.
Data_Category { DataId : number, name:string, category:string }
이며 전체적으로 중복하여 입력이 가능합니다.
select dataId, name, category, count(*) as cnt , rank() over (partition by dataId, category order by count(*) desc) as "ranking" from data_category group by dataId, name, category
위의 쿼리에서 rank 부분이 있고 없고로 속도가 너무 차이가 납니다.
rank가 없다면 0.0053, 있을 땐 0.5초가 소요가 됩니다.
select *, rank() over (partition by A.dataId, A.category order by cnt desc) as "ranking" from( select dataId, name, category, count(*) as cnt from data_category group by dataId, name, category ) A
위의 쿼리도 거의 동일한 속도가 나옵니다. select 문으로 감싸는 순간 임시테이블 생성으로 인해 느려지고 있습니다.
데이터는 40만건 정도입니다.
데이터Id별 각 카테고리 별 개수가 가장 많은 name들을 5건씩 추출하고 싶은데 쿼리 방향을 못잡겠습니다..
쿼리를 짜주시지 않더라도 간단한 힌트만이라도 간절히 부탁드립니다..!
감사합니다.
1. 조건을 안줘서 느린게 아닐런지?
2. rank 는 동순위 처리를 합니다.
- 5건 과는 조금 다른 의미, 5등의 의미로 5등이 여러명 나오면 5건 이상 나올 수 있습니다.
- 원하는 결과가 5등이 맞는지? 5건이 맞는지?
- 5건이 맞다면? ROW_NUMBER() 를 시용해야 하는데
- 이 때, 정렬순위가 동순위가 나오지 않도록하는 유니크한 추가 정렬 조건이 필요합니다.
- 예) ORDER BY COUNT(*) DESC, name -- 동순위의 경우 이름이 빠른게 우선
3. 별칭은 홑따옴표(비표준)가 아닌 쌍따옴표(표준) 사용 권장
SELECT * FROM (SELECT dataId, category, name , COUNT(*) cnt , RANK() OVER(PARTITION BY dataId, category ORDER BY COUNT(*) DESC) rk FROM data_category GROUP BY dataId, category, name ) a WHERE rk <= 5 ;