은행 거래 내역을 보고 지출 패턴을 이해하려는 개인적인 필요성이든, 영업 활동을 보고 조직의 영업 성과를 개선하려는 것이든, 진정한 인사이트는 거래 수준 데이터를 추가로 집계하고 요약해야만 볼 수 있습니다. 기존 RDBMS는 SQL 집계의 표현력을 통해 이러한 기능을 제공합니다. 창 함수는 ANSI SQL 표준에 추가되어 SQL 구조로 더 복잡한 질문을 표현할 수 있는 기능을 더욱 확장했습니다.
이제 6.5 릴리스에서 Couchbase N1QL은 창 함수 및 공통 테이블 표현식(CTE)을 지원합니다. 개발자는 더 복잡한 비즈니스 사용 사례를 충족하도록 애플리케이션을 확장할 수 있을 뿐만 아니라 데이터 분석가가 Excel에서 추가 후처리를 수행하지 않고도 필요한 답을 얻을 수 있습니다.
이 글에서는 매우 일반적인 비즈니스 질문 두 가지를 해결하기 위해 N1QL 창 기능과 CTE를 활용하는 방법에 대한 몇 가지 예시를 집중적으로 살펴보겠습니다.
고객별 영업 활동 기간
영업 활동 관리 시스템의 첫 번째 예에서는 영업팀이 2019년 1월 동안 고객과 작업한 시간을 보여주는 보고서를 제공하고자 합니다. 쿼리를 두 단계로 나누겠습니다:
1) 영업팀이 고객과 진행한 미팅 목록과 미팅 시간을 가져옵니다. 모든 고객의 총 소요 시간 'total_time_spent'는 전체 결과 집합에 대해 합산을 수행하는 빈 OVER () 절을 사용하여 약속 시간을 합산하여 계산합니다. 고객별 총 소요 시간 'account_time_spent'는 동일한 구문을 사용하지만 PARTITION 절에 'accid'를 사용합니다.
1 2 3 4 5 6 7 8 |
선택 c.name, a.startDate, a.title, a.duration, SUM(a.기간) OVER() as 총_시간_지출, SUM(a.기간) OVER(파티션 기준 a.accid) AS 계정_시간_소비 FROM crm a 내부 가입 crm c 켜기 a.accid = c.id AND c.유형='계정' 어디 a.유형='활동' AND a.activityType='약속' AND a.startDate 사이 '2018-01-01' 그리고 '2018-01-31' |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
계정_시간_소비 기간 이름 startDate title 총_시간_소비 30 "30" "스미스, 아빌라, 시스네로스" "2018-01-24 15:00:00" "전환 가능한 코히어런트 어댑터" 25770 510 "150" "Riddle Ltd" "2018-01-05 15:30:00" "간소화된 중간 인트라넷" 25770 510 "90" "Riddle Ltd" "2018-01-28 14:30:00" "고급 솔루션 중심의 시너지" 25770 510 "90" "Riddle Ltd" "2018-01-01 15:00:00" "개선된 객체 지향 방법론" 25770 510 "30" "Riddle Ltd" "2018-01-10 08:00:00" "객체 기반 다중 상태 펌웨어" 25770 510 "150" "Riddle Ltd" "2018-01-23 09:00:00" "다층적인 체계적인 소프트웨어" 25770 120 "30" "Foster Inc" "2018-01-29 09:30:00" "공개 키 수익 데이터베이스" 25770 120 "30" "Foster Inc" "2018-01-09 13:00:00" "품질 중심의 로컬 에뮬레이션" 25770 120 "60" "Foster Inc" "2018-01-02 08:00:00" "디지털화된 동기 부여 매트릭스" 25770 120 "30" "Williams Ltd" "2018-01-22 08:30:00" "다재다능한 휴리스틱 인력" 25770 120 "30" "Williams Ltd" "2018-01-24 13:30:00" "최전선 4세대 헬프 데스크" 25770 120 "60" "Williams Ltd" "2018-01-14 14:30:00" "비전 있는 상승 추세의 성공" 25770 330 "150" "Reid Ltd" "2018-01-21 10:30:00" "심오한 물류 아카이브" 25770 330 "30" "Reid Ltd" "2018-01-13 13:30:00" "다운사이징된 일관된 액세스" 25770 330 "120" "Reid Ltd" "2018-01-02 12:00:00" "최전방 객체 지향 중재자" 25770 330 "30" "Reid Ltd" "2018-01-12 09:30:00" "프로그래밍 가능한 상호 인프라" 25770 .... |
2) 그런 다음 두 지표를 사용하여 팀이 각 고객과 보낸 전체 시간에서 차지하는 비율을 도출합니다.
1 2 3 4 5 6 7 8 9 10 |
선택 c.name, 라운드(( SUM(SUM(a.기간)) OVER(파티션 기준 a.accid) / SUM(SUM(a.기간)) OVER()),2) as pct_time FROM crm a 내부 가입 crm c 켜기 a.accid = c.id AND c.유형='계정' 어디 a.유형='활동' AND a.activityType='약속' AND a.startDate 사이 '2018-01-01' 그리고 '2018-01-31' 그룹 BY c.name, a.accid 주문 기준 2 DESC |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
이름 pct_시간 "존슨, 아담스, 켈리" 0.17 "데이비스 그룹" 0.08 "길버트-모리스" 0.08 "토레스와 아들들" 0.07 "Reid Ltd" 0.07 "메디나-다니엘" 0.07 "Riddle Ltd" 0.05 "헨더슨과 아들들" 0.05 "길과 아들" 0.05 "Garcia-Young" 0.05 "설리반 PLC" 0.03 "브라운-로저스" 0.03 "Foster Inc" 0.03 "휠러 주식회사" 0.03 "자비스-스몰" 0.03 "Jones-Fox" 0.03 "로이드, 블레어, 프루이트" 0.03 "본 LLC" 0.02 |
월별 영업 활동
이 두 번째 예에서는 2018년 한 해 동안 영업 관련 작업 수가 월별로 어떻게 변화했는지 쿼리로 보여줍니다. 이 쿼리는 쿼리의 가독성을 높이기 위해 N1QL CTE 기능을 활용하며, 이전 기간의 작업 수를 얻기 위해 LAG 창 기능도 활용합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
WITH 현재_기간_작업 AS ( 선택 DATE_TRUNC_STR(a.startDate,'month') AS 월, COUNT(1) AS 현재_기간_작업_수 FROM crm a 어디 a.유형='활동' AND a.activityType = '작업' AND DATE_PART_STR(a.startDate,'year') = 2018 그룹 BY DATE_TRUNC_STR(a.startDate,'month') ), 마지막_기간_작업 AS ( 선택 x.월, x.current_period_task_count, LAG(x.current_period_task_count) OVER ( 주문 기준 x.월) AS 마지막_기간_작업_수 FROM 현재_기간_작업 x ) 선택 b.월, b.current_period_task_count, 라운드(((b.current_period_task_count - b.last_period_task_count ) / b.last_period_task_count),2) AS MoMChg FROM 마지막_기간_작업 AS b |
- 첫 번째 CTE인 'current_period_task'는 달력 월별로 Task 그룹 유형의 모든 활동에 대한 개수를 검색하는 쿼리를 정의합니다.
- 두 번째 CTE인 'last_period_task'는 첫 번째 CTE에서 읽으며, 창 함수 LAG를 활용하여 이전 달의 task_count를 반환합니다. LAG 함수가 작동하려면 ORDER BY 절이 중요합니다.
- 메인 쿼리는 두 번째 CTE인 'last_period_task'를 읽고 월별 계산을 도출합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
MoMChg 현재_기간_작업_수 월 283 "2018-01-01" -0.08 260 "2018-02-01" 0.1 287 "2018-03-01" -0.08 264 "2018-04-01" 0.11 292 "2018-05-01" 0 293 "2018-06-01" -0.03 285 "2018-07-01" 0 285 "2018-08-01" 0 284 "2018-09-01" 0 283 "2018-10-01" -0.05 268 "2018-11-01" 0.06 285 "2018-12-01" |
리소스
6.5의 기능이 마음에 드셨는지, 앞으로 비즈니스에 어떤 도움이 될지 여러분의 의견을 듣고 싶습니다. 댓글을 통해 의견을 공유해 주시거나 포럼.