고객별 연관 상품 추출 수업 관련 질문
422
5 câu hỏi đã được viết
안녕하세요,
주변별 고객별 연관 상품 추출 sql 구하기 -02
수업 관련해서 질문 드리겠습니다.
해당 쿼리문 결과값 중 'cnt' 열에 해당되는 횟수가 출력이 되는데, 예를 들면 위 사진에 보이는 출력 열 'cnt' 3에 해당되는 user_id 를 알고 싶을 때는 어떤 쿼리를 작성해야되나요?
Câu trả lời 1
1
안녕하십니까,
명절 관계로 답변이 좀 늦었습니다.
cnt에 해당하는 user_id가 정확히 어떤 의미인지를 잘 모르겠군요.
group by 를 prod_01, prod_02로 하였기 때문에 cnt는 temp_01 집합의 prod_01 + prod_02의 건수입니다.
다만 추측컨데 temp_01 집합에 대해서 prod_01 + prod_02 레벨에 해당하는 user_id 정보를 추출하고자 하는걸로 가정해서 말씀드리겠습니다.
먼저 아래 temp_02 집합에서 group by가 prod_01 + prod_02로 집합 레벨(유일 집합)이 변경되었으므로 user_id는 ANSI-SQL 상으로는 추출할 수가 없습니다.
temp_02 as (
select prod_01, prod_02, array_to_string(array_agg(user_id), ',') customer_array, count(*) as cnt
from temp_01
group by prod_01, prod_02
)
다만 유일한 prod_01 + prod_02 에 해당하는 user_id 하나를 대표 user_id로 max(user_id)와 같이 추출하는 방법이 있을수 있고,
다음으로는 특정 집합에 group by 를 적용하기 전 집합 레벨로 특정 컬럼들을 array 형태로 추출하는 함수를 DBMS 별로 제공하고 있습니다. PostgreSQL은 array_agg()함수를 사용하는데 보통은 이 array를 string으로 변환하는 array_to_string()과 함께 사용합니다.
그래서 temp_02를 생성할 때 아래와 같이 array_to_stirng(array_agg(user_id), delimeter 문자열)을 사용하게 되면 prod_0a + prod_02 레벨에 해당하는 user_id를 배열 형태의 문자열로 반환하게 됩니다.
temp_02 as (
select prod_01, prod_02, array_to_string(array_agg(user_id), ',') as user_id_array, count(*) as cnt
from temp_01
group by prod_01, prod_02
)
아래는 전체 SQL이니 참조하시기 바랍니다.
with
-- user_id는 order_items에 없으므로 order_items와 orders를 조인하여 user_id 추출.
temp_00 as (
select b.user_id,a.order_id, a.product_id
from order_items a
join orders b on a.order_id = b.order_id
),
-- temp_00을 user_id로 셀프 조인하면 M:M 조인되면서 개별 user_id별 주문 상품별로 연관된 주문 상품 집합을 생성
temp_01 as
(
select a.user_id, a.product_id as prod_01, b.product_id as prod_02
from temp_00 a
join temp_00 b on a.user_id = b.user_id
where a.product_id != b.product_id
),
-- prod_01 + prod_02 레벨로 group by 건수를 추출.
temp_02 as (
select prod_01, prod_02, array_to_string(array_agg(user_id), ',') as user_id_array, count(*) as cnt
from temp_01
group by prod_01, prod_02
),
temp_03 as (
select prod_01, prod_02, user_id_array, cnt
-- prod_01별로 가장 많은 건수를 가지는 prod_02를 찾기 위해 cnt가 높은 순으로 순위추출.
, row_number() over (partition by prod_01 order by cnt desc) as rnum
from temp_02
)
-- 순위가 1인 데이터만 별도 추출.
select prod_01, prod_02, user_id_array, cnt, rnum
from temp_03
where rnum = 1
;
감사합니다.
"주문별 고객별 연관 상품 추출 SQL로 구하기-02" 수업 질문
0
51
2
쿼리 질문있습니다!!
0
49
2
없는강의요청해도됩니까,,
0
89
2
아래와 동일한 질문에 대한 추가질문입니다
0
69
2
cnt/max로 구한 결과의 차이
0
100
2
쿼리에 대한 질문이 있습니다.
0
116
2
퍼널 질문드립니다.
0
112
1
ADSP자격증
0
281
2
특정 스키마에서 생성한 편집기의 쿼리를 판다스에 삽입하는 방법
0
161
1
백업파일 테이블 생성 오류
0
233
1
"사용자별 특정 상품 주문시 함께 가장 많이 주문된 다른 상품 추출하기"에서 조건관련..
0
161
1
Plotly을 이용해 treemap시각화시 공유사항
0
277
2
월단위 카테고리별 매출액과 주문건수 및 전체매출액 대비 비율 sql로 구하기 수업 중 질문이 있습니다.
0
247
1
with 절 질문
0
239
1
데이터 분석 SQL Fundamentals 강의 할인 문의
0
214
1
리텐션 구하는 방법 문의
0
215
1
캐글데이터 Postgresql 사용
0
352
2
mau 구할때 group by 사용안해도 count 집계함수가 왜 가능한지 모르겠습니다.
0
261
1
매출분석 1에서 partition by와 group by의 차이
0
355
1
postgres 설치 오류
0
316
1
맥 계정에서 postgres 접속 시 비밀번호 입력 실패현상
1
542
2
pandas 연계시 오류.....
0
1242
3
시각화 그래프가 안보여요
0
298
1
ntile 정규분포에 관하여 ... 향후 일을 하게 될 시
0
357
1

