-- 검색 실패 구간의 신규 계정 : 첫 요청 실패 vs 같은 구간 · 같은 시간대 성공
WITH r AS (SELECT CAST(account_id AS STRING) acct, TO_DATE(CAST(created_date AS TIMESTAMP)) d,
CAST(created_date AS TIMESTAMP) t, status
FROM bronze.miridih_miricanvas_designcontent_template.component_search_request_log),
f AS (SELECT acct, MIN(t) t0 FROM r GROUP BY 1),
fr AS (SELECT r.*, CASE WHEN r.d BETWEEN '2026-07-06' AND '2026-07-12' THEN 'E1'
WHEN r.d BETWEEN '2026-08-26' AND '2026-08-27' THEN 'E2' END ep
FROM r JOIN f ON f.acct = r.acct AND r.t = f.t0),
ad AS (SELECT DISTINCT account_id acct, p_date FROM temp.mryu_temp.cyc7_ev WHERE event_name = 'action_component'),
x AS (SELECT fr.acct, CONCAT(fr.ep, '|', HOUR(fr.t + INTERVAL 9 HOURS) DIV 3) stratum,
CASE WHEN fr.status = 'FAILED' THEN 1 ELSE 0 END failed,
MAX(CASE WHEN a.acct IS NOT NULL THEN 1.0 ELSE 0.0 END) adopt_day0,
MAX(CASE WHEN r2.d > fr.d AND r2.d <= DATE_ADD(fr.d, 14) THEN 1.0 ELSE 0.0 END) revisit14
FROM fr LEFT JOIN ad a ON a.acct = fr.acct AND a.p_date = CAST(fr.d AS STRING)
LEFT JOIN r r2 ON r2.acct = fr.acct
WHERE fr.ep IS NOT NULL GROUP BY 1, 2, 3)
SELECT stratum, failed, COUNT(*) accounts, ROUND(100 * AVG(adopt_day0), 1) adopt_day0_pct,
ROUND(100 * AVG(revisit14), 1) revisit14_pct
FROM x GROUP BY 1, 2;
-- 층화(두 군이 함께 있는 6층) : 실패 155 · 성공 1,051
-- 첫날 채택 −29.5pp (±5.1) · 14일 재방문 −0.8pp (±6.4) · Wald 채택 1건당 +2.6pp (−19.1 – +24.4)
-- 채택 이벤트의 요소 id(9/1~) x 에디터 편집 이벤트의 요소 id
CREATE OR REPLACE TABLE temp.mryu_temp.cyc9_ins AS
SELECT p_date, event_timestamp ts, design_idx, search_id, action_item component_key,
node_id node_list, EXPLODE(SPLIT(node_id, ',')) node
FROM bronze.google_analytics_miricanvas.events_except_miridih
WHERE p_date BETWEEN '2026-09-01' AND '2026-09-13' AND event_name = 'action_component' AND node_id <> '';
CREATE OR REPLACE TABLE temp.mryu_temp.cyc9_edit AS
SELECT e.p_date, e.event_timestamp ts, e.design_idx, e.event_name, e.action_name, e.element_type,
EXPLODE(SPLIT(e.node_id, ',')) node
FROM bronze.google_analytics_miricanvas.events_except_miridih e
JOIN (SELECT DISTINCT design_idx FROM temp.mryu_temp.cyc9_ins) d USING (design_idx)
WHERE e.p_date BETWEEN '2026-09-01' AND '2026-09-13' AND e.event_name LIKE 'mican_action_%';
-- 같은 디자인 안: 넣은 텍스트를 고친 채택 vs 안 고친 채택의 다운로드본 잔존
WITH ins AS (SELECT design_idx, search_id, component_key, MIN(ts) ts, COLLECT_SET(node) nodes
FROM temp.mryu_temp.cyc9_ins WHERE p_date <= '2026-09-06' GROUP BY 1, 2, 3),
own AS (SELECT i.design_idx, i.component_key,
CASE WHEN COUNT(DISTINCT CASE WHEN e.event_name IN ('mican_action_text', 'mican_action_setitem_text')
THEN e.node END) > 0 THEN 1 ELSE 0 END t
FROM ins i LEFT JOIN temp.mryu_temp.cyc9_edit e
ON e.design_idx = i.design_idx AND e.ts > i.ts AND ARRAY_CONTAINS(i.nodes, e.node)
GROUP BY 1, 2),
dl AS (SELECT DISTINCT design_idx, component_key FROM temp.mryu_temp.dl_component
WHERE p_date BETWEEN '2026-09-01' AND '2026-09-09')
SELECT o.t text_edited, COUNT(*) pairs,
ROUND(100 * AVG(CASE WHEN dl.component_key IS NOT NULL THEN 1.0 ELSE 0 END), 1) in_download_pct
FROM own o
JOIN (SELECT DISTINCT design_idx FROM dl) dd USING (design_idx)
LEFT JOIN dl ON dl.design_idx = o.design_idx AND dl.component_key = o.component_key
GROUP BY 1;
-- 같은 디자인 안(두 군 공존 158 디자인) 68.1% vs 14.8% · MH +53.6pp · 디자인 군집 z 14.5
-- ① 인풋 항상 편집모드(9/1) : 같은 계정의 10분 안 재검색 · 채택 전후
WITH s AS (SELECT account_id, p_date, search_id, MIN(event_timestamp) ts
FROM temp.mryu_temp.cyc7_ev
WHERE event_name = 'search_component' AND p_date BETWEEN '2026-08-11' AND '2026-09-13' AND p_date <> '2026-08-27'
GROUP BY 1, 2, 3),
o AS (SELECT *, LEAD(ts) OVER (PARTITION BY account_id ORDER BY ts) nts,
CASE WHEN p_date < '2026-09-01' THEN 'pre' ELSE 'post' END per FROM s),
a AS (SELECT DISTINCT search_id FROM temp.mryu_temp.cyc7_ev WHERE event_name = 'action_component'),
y AS (SELECT o.account_id, o.per, CASE WHEN nts - ts <= 600000000 THEN 1.0 ELSE 0.0 END rs,
CASE WHEN a.search_id IS NOT NULL THEN 1.0 ELSE 0.0 END ad FROM o LEFT JOIN a USING (search_id)),
acct AS (SELECT account_id, AVG(CASE WHEN per = 'post' THEN rs END) - AVG(CASE WHEN per = 'pre' THEN rs END) d_rs
FROM y GROUP BY 1
HAVING SUM(CASE WHEN per = 'pre' THEN 1 ELSE 0 END) >= 1 AND SUM(CASE WHEN per = 'post' THEN 1 ELSE 0 END) >= 1)
SELECT COUNT(*) accounts, ROUND(100 * AVG(d_rs), 2) within_pp, ROUND(100 * 1.96 * STDDEV_SAMP(d_rs) / SQRT(COUNT(*)), 2) ci95
FROM acct;
-- 523 계정 · −0.12pp (±2.72)
-- ② 세트가 모자랄 때 대응(9/8) : 분할 vs 비분할 검색 채택 이중차분
WITH v AS (SELECT search_id, MIN(p_date) d, MAX(CASE WHEN is_split_applied = 'true' THEN 1 ELSE 0 END) sp,
COUNT(DISTINCT sub_search_id) n_sub
FROM temp.mryu_temp.cyc7_ev
WHERE event_name = 'view_component' AND p_date BETWEEN '2026-08-11' AND '2026-09-13' AND p_date <> '2026-08-27'
GROUP BY 1),
a AS (SELECT DISTINCT search_id FROM temp.mryu_temp.cyc7_ev WHERE event_name = 'action_component')
SELECT CASE WHEN d < '2026-09-08' THEN 'pre' ELSE 'post' END per, sp, COUNT(*) searches,
ROUND(100 * AVG(CASE WHEN a.search_id IS NOT NULL THEN 1.0 ELSE 0 END), 1) adopt_pct,
ROUND(100.0 * SUM(CASE WHEN sp = 1 AND n_sub = 1 THEN 1 ELSE 0 END) / COUNT(*), 1) one_sub_pct
FROM v LEFT JOIN a USING (search_id) GROUP BY 1, 2;
-- 분할 34.3 → 37.0% · 비분할 49.4 → 49.9% → +2.1pp (−1.6 – +5.9) · 세트 빔 12.4 → 12.0%
-- ③ 기본 표 추가 : 표 요구 vs 차트 요구 채택 (쿼리는 H38 과 같은 틀, 구간만 07-28 / 08-11 / 09-08)
-- A/B 시작 경계 +0.9pp (±4.2) · 전체 적용 경계 −7.3pp (−12.9 – −1.7)
-- 장식 요소 경로 x 컴포넌트 채택 겹침 (디자인 · 유저 단위, 두 기간)
WITH ad AS (SELECT DISTINCT user_pseudo_id u, design_idx,
CASE WHEN p_date < '2026-08-20' THEN 'P1' ELSE 'P2' END per
FROM temp.mryu_temp.cv_events -- GA 직원 제외판 컴포넌트 이벤트
WHERE event_name = 'action_component' AND p_date BETWEEN '2026-07-28' AND '2026-09-09'),
dz AS (SELECT DISTINCT user_pseudo_id u, design_idx,
CASE WHEN p_date < '2026-08-20' THEN 'P1' ELSE 'P2' END per
FROM temp.mryu_temp.cyc7_deco -- search/view/action_decoration
WHERE p_date BETWEEN '2026-07-28' AND '2026-09-09')
SELECT a.per,
COUNT(DISTINCT a.design_idx) comp_designs,
COUNT(DISTINCT CASE WHEN d.design_idx IS NOT NULL THEN a.design_idx END) also_deco,
ROUND(100.0 * COUNT(DISTINCT CASE WHEN d.design_idx IS NOT NULL THEN a.design_idx END)
/ COUNT(DISTINCT a.design_idx), 1) pct
FROM ad a LEFT JOIN dz d ON d.design_idx = a.design_idx AND d.per = a.per
GROUP BY a.per;
-- P1 90 / 3,683 (2.4%) · P2 119 / 4,602 (2.6%) · 유저 단위 3.4–4.8%
-- 차트 공급 축소(v2 전환 7/28) x 채택 : 표를 대조로 한 이중차분
WITH s AS (
SELECT search_sub_key sk, CAST(created_date AS TIMESTAMP) t, hybrid_search_result_count r,
CASE WHEN content_data LIKE '%"type":"Chart%' THEN 'chart'
WHEN content_data LIKE '%"type":"Table"%' THEN 'table' END kind
FROM bronze.miridih_miricanvas_designcontent_template.component_search_summary_log
WHERE CAST(created_date AS TIMESTAMP) >= '2026-07-06' AND CAST(created_date AS TIMESTAMP) < '2026-09-10'
AND get_json_object(search_options, '$.executionMode') = 'STRUCTURE_ONLY'
AND COALESCE(reviewer, '') = ''), -- 검수자 AI 평가 배치 제외
vw AS (SELECT DISTINCT sub_search_id FROM temp.mryu_temp.cyc7_ev WHERE event_name = 'view_component'),
ac AS (SELECT DISTINCT sub_search_id FROM temp.mryu_temp.cyc7_ev WHERE event_name = 'action_component')
SELECT kind,
CASE WHEN t < '2026-07-27' THEN 'pre' WHEN t >= '2026-07-28' THEN 'post' END per, -- 전환 주 제외
COUNT(*) subs,
ROUND(100 * AVG(CASE WHEN r = 0 THEN 1.0 ELSE 0 END), 1) zero_pct,
ROUND(100 * AVG(CASE WHEN vw.sub_search_id IS NOT NULL
THEN (CASE WHEN ac.sub_search_id IS NOT NULL THEN 1.0 ELSE 0 END) END), 1) adopt_if_viewed
FROM s LEFT JOIN vw ON vw.sub_search_id = s.sk LEFT JOIN ac ON ac.sub_search_id = s.sk
WHERE kind IS NOT NULL GROUP BY 1, 2;
-- 차트 29.6 → 29.8% · 표 44.1 → 45.8% → 이중차분 −1.6pp (±3.0)
-- 후보 0: 차트 4.9 → 7.5% · 표 3.7 → 4.0% → +2.3pp (±1.3)
-- 차트 종류별 공급 (세대별)
SELECT regexp_extract(structure_json, '"chartType":\\s*"([A-Z_]+)"', 1) chart_type,
SUM(CASE WHEN major = 1 THEN 1 ELSE 0 END) v1, SUM(CASE WHEN major = 2 THEN 1 ELSE 0 END) v2
FROM bronze.miridih_miricanvas_designcontent_template.components
WHERE preset_type IN ('CHART', 'FAKE_CHART') GROUP BY 1;
-- 세로 막대 923 → 88 · 영역 선 150 → 0 · 선 77 → 14
-- 컴포넌트별 노출 (검색 × 컴포넌트 첫 노출), 08-01 – 09-13
WITH v AS (SELECT search_id, view_item_key, MIN(p_date) d
FROM temp.mryu_temp.cyc6_ev -- GA 직원 제외판 재적재
WHERE event_name = 'view_component' GROUP BY 1,2),
p AS (SELECT view_item_key k,
SUM(CASE WHEN d < '2026-08-23' THEN 1 ELSE 0 END) e1,
SUM(CASE WHEN d >= '2026-08-23' THEN 1 ELSE 0 END) e2
FROM v GROUP BY 1),
c AS (SELECT r.component_key, r.ctype, COALESCE(p.e1,0) e1, COALESCE(p.e2,0) e2
FROM temp.mryu_temp.cyc6_reach r LEFT JOIN p ON p.k = r.component_key), -- v2 카탈로그 88,518
rk AS (SELECT *, ROW_NUMBER() OVER (PARTITION BY ctype ORDER BY e1 DESC, component_key) r1,
ROW_NUMBER() OVER (PARTITION BY ctype ORDER BY e2 DESC, component_key) r2,
COUNT(*) OVER (PARTITION BY ctype) nt FROM c)
SELECT ctype,
ROUND(100.0*SUM(CASE WHEN r1 <= nt*0.01 THEN e1 ELSE 0 END)/SUM(e1),1) p1_top1,
ROUND(100.0*SUM(CASE WHEN r2 <= nt*0.01 THEN e2 ELSE 0 END)/SUM(e2),1) p2_top1,
ROUND(100.0*SUM(CASE WHEN r1 <= nt*0.01 AND r2 <= nt*0.01 THEN 1 ELSE 0 END)
/ SUM(CASE WHEN r1 <= nt*0.01 THEN 1 ELSE 0 END),1) top1_persist,
ROUND(100.0*AVG(CASE WHEN e1 = 0 THEN (CASE WHEN e2 > 0 THEN 1.0 ELSE 0 END) END),1) new_reach
FROM rk GROUP BY ctype;
-- 일반: 58.9 / 58.5 · 유지 91.8% · 첫 노출 6.4%
-- 미노출 대리 분류: 셀 = 슬롯 수 x 용량 8구간 x 제목 유무 x 컨테이너 수, 셀 노출률로 분류
WITH c AS (SELECT ctype, expo_searches,
CONCAT(ctype,'|',LEAST(n_cap_slots,20),'|',
CASE WHEN cap_total < 50 THEN 0 WHEN cap_total < 100 THEN 1 WHEN cap_total < 150 THEN 2 WHEN cap_total < 200 THEN 3
WHEN cap_total < 300 THEN 4 WHEN cap_total < 400 THEN 5 WHEN cap_total < 600 THEN 6 ELSE 7 END,'|',
CASE WHEN n_title >= 1 THEN 1 ELSE 0 END,'|', LEAST(n_container,12)) k
FROM temp.mryu_temp.cyc6_reach),
cell AS (SELECT k, COUNT(*) n, AVG(CASE WHEN expo_searches > 0 THEN 1.0 ELSE 0 END) er FROM c GROUP BY k)
SELECT c.ctype,
SUM(CASE WHEN cell.n >= 10 AND cell.er < 0.05 THEN 1 ELSE 0 END) AS not_reached_structure,
SUM(CASE WHEN cell.n >= 10 AND cell.er >= 0.20 THEN 1 ELSE 0 END) AS same_structure_reached
FROM c JOIN cell USING (k) WHERE c.expo_searches = 0 GROUP BY c.ctype;
-- ① 같은 템플릿 안 노출 확률 (군집 = 템플릿)
WITH c AS (SELECT template_key, CASE WHEN expo_searches > 0 THEN 1 ELSE 0 END e,
CASE WHEN n_img >= 1 THEN 1 ELSE 0 END iA, CASE WHEN n_svg >= 8 THEN 1 ELSE 0 END dA,
CASE WHEN n_marker >= 1 THEN 1 ELSE 0 END mA,
CONCAT(CASE WHEN n_cap_slots<=2 THEN 'a' WHEN n_cap_slots<=4 THEN 'b' WHEN n_cap_slots<=8 THEN 'c'
WHEN n_cap_slots<=16 THEN 'd' ELSE 'e' END,'|',
CASE WHEN cap_total<50 THEN 1 WHEN cap_total<150 THEN 2 WHEN cap_total<300 THEN 3
WHEN cap_total<600 THEN 4 ELSE 5 END) k
FROM temp.mryu_temp.cyc6_reach WHERE ctype = 'gen'),
st AS (SELECT template_key cl, CONCAT(k,'|',iA,mA) kk,
CAST(SUM(dA) AS DOUBLE) n1, CAST(SUM(dA*e) AS DOUBLE) s1,
CAST(SUM(1-dA) AS DOUBLE) n0, CAST(SUM((1-dA)*e) AS DOUBLE) s0
FROM c GROUP BY 1,2),
f AS (SELECT *, n1+n0 N FROM st WHERE n1 >= 1 AND n0 >= 1),
ct AS (SELECT cl, SUM((s1*n0-s0*n1)/N) a_num, SUM(n1*n0/N) b_den FROM f GROUP BY cl),
tot AS (SELECT SUM(a_num)/SUM(b_den) rd, SUM(b_den) bsum, COUNT(*) T FROM ct)
SELECT ROUND(100*MAX(rd),2) mh_pp,
ROUND(MAX(rd)/SQRT(SUM(POWER(a_num - rd*b_den,2))/POWER(MAX(bsum),2) * MAX(T)/(MAX(T)-1.0)),1) z_cluster
FROM ct CROSS JOIN tot;
-- 장식 +9.33pp (z 13.4) · 이미지 +14.28pp (z 18.7) · 번호 +0.06pp (z 0.1)
-- ② 순위: 10위 밖까지 스크롤된 검색에서 상위 10위 여부의 잔차를 컴포넌트마다 평균
WITH v AS (SELECT search_id, view_item_key, MIN(load_seq) rk FROM temp.mryu_temp.cyc6_ev
WHERE event_name = 'view_component' AND load_seq IS NOT NULL GROUP BY 1,2),
deep AS (SELECT search_id FROM v GROUP BY 1 HAVING MAX(rk) > 10),
x AS (SELECT v.search_id, v.view_item_key, CASE WHEN v.rk <= 10 THEN 1.0 ELSE 0.0 END top,
CASE WHEN r.cap_total<150 THEN 1 WHEN r.cap_total<300 THEN 2 ELSE 3 END cb,
CASE WHEN r.n_img >= 1 THEN 1 ELSE 0 END iA
FROM v JOIN deep USING (search_id) JOIN temp.mryu_temp.cyc6_reach r ON r.component_key = v.view_item_key
WHERE r.ctype = 'gen'),
s AS (SELECT x.*, top - AVG(top) OVER (PARTITION BY search_id, cb) res FROM x),
comp AS (SELECT view_item_key, MAX(iA) iA, AVG(res) cres FROM s GROUP BY 1)
SELECT ROUND(100*(AVG(CASE WHEN iA=1 THEN cres END) - AVG(CASE WHEN iA=0 THEN cres END)),2) diff_pp
FROM comp;
-- 이미지 +5.28pp (t 10.7) · 장식 +4.50pp · 번호 −2.17pp
-- 표/차트(구조 전용) 하위 검색: 후보 수 구간 x 요구 구조 x 채택
WITH s AS (SELECT search_sub_key, hybrid_search_result_count r, CAST(content_data AS STRING) cd
FROM bronze.miridih_miricanvas_designcontent_template.component_search_summary_log
WHERE CAST(created_date AS TIMESTAMP) >= '2026-08-01'
AND get_json_object(search_options,'$.executionMode') = 'STRUCTURE_ONLY'
AND COALESCE(reviewer, '') = ''), -- 검수자 AI 평가 배치 제외
vw AS (SELECT DISTINCT sub_search_id FROM temp.mryu_temp.cyc6_ev WHERE event_name = 'view_component'),
ad AS (SELECT DISTINCT sub_search_id FROM temp.mryu_temp.cyc6_ev WHERE event_name = 'action_component')
SELECT CASE WHEN r=0 THEN 'a 0' WHEN r<10 THEN 'b 1–9' WHEN r<50 THEN 'c 10–49' ELSE 'd 50+' END rb,
COUNT(*) subs,
ROUND(AVG(SIZE(SPLIT(cd,'"type":"Text"'))-1),1) txt,
ROUND(AVG(SIZE(SPLIT(cd,'"type":"Group"'))-1),1) grp,
ROUND(100.0*AVG(CASE WHEN vw.sub_search_id IS NOT NULL
THEN (CASE WHEN ad.sub_search_id IS NOT NULL THEN 1.0 ELSE 0 END) END),1) adopt_if_viewed
FROM s LEFT JOIN vw ON vw.sub_search_id = s.search_sub_key
LEFT JOIN ad ON ad.sub_search_id = s.search_sub_key
GROUP BY 1 ORDER BY 1;
-- 0: 991건 텍스트 6.5 그룹 8.3 (노출 없음) · 1–9: 2,051건 29.9% · 10–49: 12,361건 46.4% · 50+: 4,598건 38.1%
-- 검색 단위 분석표 (2026-08-01 이후)
CREATE OR REPLACE TABLE temp.mryu_temp.c5_split AS
WITH v AS (SELECT search_id,
MAX(CASE WHEN is_split_applied='true' THEN 1 ELSE 0 END) sp,
COUNT(DISTINCT sub_search_id) n_sub
FROM temp.mryu_temp.cv_events
WHERE event_name='view_component' AND p_date >= '2026-08-01' AND search_id IS NOT NULL
GROUP BY 1)
SELECT n.search_id, n.acc AS account_id, n.d, n.route, v.sp, v.n_sub,
n.raw_len, n.raw_lines, n.has_bullet, n.sum_len, n.n_head, n.n_bullet,
n.adopted, n.survived, n.dl7
FROM temp.mryu_temp.n_input n JOIN v ON v.search_id = n.search_id
WHERE n.sum_len > 0;
-- 분할 식별자 검증: summary 의 단독 '---' 줄이 2개 이상 ⇔ 분할 (분할의 99.7%, 비분할의 1.2%)
-- 비중복 담긴 비율: 조각(sub_search_id)마다 채택 컴포넌트 중 최대 용량 하나만, 조각끼리 합산
WITH vi AS (SELECT search_id, view_item_key, sub_search_id,
ROW_NUMBER() OVER (PARTITION BY search_id, view_item_key
ORDER BY CAST(view_load_num AS INT), event_timestamp) rn
FROM temp.mryu_temp.cv_events
WHERE event_name='view_component' AND p_date >= '2026-08-01'),
ps AS (SELECT i.search_id, v.sub_search_id, MAX(i.cap_total) cp -- cap_total = structure_json 의 totalMaxChars 합
FROM temp.mryu_temp.c4_item2 i
JOIN vi v ON v.search_id = i.search_id AND v.view_item_key = i.view_item_key AND v.rn = 1
WHERE i.picked = 1 GROUP BY 1,2),
pc AS (SELECT search_id, SUM(cp) cap_nd FROM ps GROUP BY 1),
x AS (SELECT s.sp, s.adopted, LEAST(COALESCE(pc.cap_nd,0)/s.sum_len, 1.0) cov_nd,
-- 층 = 라우트 x 원문 길이 x 원문 줄 수 x 글머리 x summary 항목 수 x summary 길이
CONCAT(route,'|',
CASE WHEN raw_len<150 THEN 1 WHEN raw_len<300 THEN 2 WHEN raw_len<600 THEN 3
WHEN raw_len<1200 THEN 4 ELSE 5 END,'|',
CASE WHEN raw_lines<=4 THEN 1 WHEN raw_lines<=11 THEN 2 WHEN raw_lines<=24 THEN 3 ELSE 4 END,'|',
has_bullet,'|',
CASE WHEN n_head+n_bullet<=5 THEN 1 WHEN n_head+n_bullet<=11 THEN 2
WHEN n_head+n_bullet<=23 THEN 3 ELSE 4 END,'|',
CASE WHEN sum_len<500 THEN 1 WHEN sum_len<900 THEN 2 ELSE 3 END) k2
FROM temp.mryu_temp.c5_split s LEFT JOIN pc ON pc.search_id = s.search_id),
st AS (SELECT k2,
CAST(SUM(sp) AS DOUBLE) n1, CAST(SUM(1-sp) AS DOUBLE) n0,
AVG(CASE WHEN sp=1 THEN adopted END) m1, AVG(CASE WHEN sp=0 THEN adopted END) m0,
VAR_POP(CASE WHEN sp=1 THEN adopted END) v1, VAR_POP(CASE WHEN sp=0 THEN adopted END) v0
FROM x GROUP BY k2),
f AS (SELECT *, n1*n0/(n1+n0) w FROM st WHERE n1 >= 1 AND n0 >= 1)
SELECT ROUND(SUM(w*m1)/SUM(w),4) multi, ROUND(SUM(w*m0)/SUM(w),4) single,
ROUND(SUM(w*(m1-m0))/SUM(w),4) diff,
ROUND((SUM(w*(m1-m0))/SUM(w)) / (SQRT(SUM(w*w*(v1/n1+v0/n0)))/SUM(w)),1) z
FROM f;
-- 채택 0.3545 vs 0.5385 → −0.184 (z=−17.3) · 279층
-- 같은 식으로 결과만 바꿔 계산:
-- 담긴 비율(비중복, 채택 시) 0.418 vs 0.572 (z=−16.1) · 검색당 기대 담김 0.149 vs 0.308 (z=−24.1)
-- 7일 다운로드 0.739 vs 0.735 (ns) · 계정 고정효과 채택 −0.189 (z=−24.4)
-- 공급 카탈로그 조인 + 구조 파생 (v2 원본에서 직접)
CREATE OR REPLACE TABLE temp.mryu_temp.c4_struct AS
WITH ek AS (SELECT DISTINCT view_item_key AS k FROM temp.mryu_temp.c4_item),
c AS (SELECT c.component_key, c.structure_json AS sj,
ROW_NUMBER() OVER (PARTITION BY c.component_key
ORDER BY c.major DESC, c.minor DESC, c.updated_date DESC) rn
FROM bronze.miridih_miricanvas_designcontent_template.components c
JOIN ek ON ek.k = c.component_key)
SELECT component_key,
-- 담을 수 있는 총 글자 수 = totalMaxChars 합
AGGREGATE(TRANSFORM(REGEXP_EXTRACT_ALL(sj, '"totalMaxChars": ([0-9]+)', 1),
x -> CAST(x AS INT)), 0, (a,b) -> a+b) AS cap_total,
SIZE(SPLIT(sj, '"type": "Text"')) - 1 AS n_text,
SIZE(SPLIT(sj, '"type": "SVG"')) - 1 AS n_svg,
SIZE(SPLIT(sj, 'Role.Element.Marker')) - 1 AS n_marker
FROM c WHERE rn = 1;
-- ★ $.** 로 노드를 세면 patternDimensions 가 섞여 1.8배 과대 계수된다
-- 용량 비율 구간별 MH (층 = 검색 x 스크롤 구간)
WITH b AS (
SELECT search_id, pos, picked,
CASE WHEN cap_total/sum_len < 0.15 THEN 'A <0.15'
WHEN cap_total/sum_len < 0.30 THEN 'B 0.15-0.30'
WHEN cap_total/sum_len < 0.60 THEN 'C 0.30-0.60'
WHEN cap_total/sum_len < 1.00 THEN 'D 0.60-1.00'
WHEN cap_total/sum_len < 2.00 THEN 'E 1.00-2.00'
ELSE 'F 2.00+' END AS rb
FROM temp.mryu_temp.c4_item2
WHERE n_text IS NOT NULL AND sum_len IS NOT NULL AND sum_len > 0),
lng AS (SELECT search_id, pos, picked, r.rb AS var,
CASE WHEN b.rb = r.rb THEN 1 ELSE 0 END AS t
FROM b CROSS JOIN (SELECT DISTINCT rb FROM b) r),
st AS (SELECT var, search_id, pos,
CAST(SUM(t) AS DOUBLE) n1, CAST(SUM(t*picked) AS DOUBLE) s1,
CAST(SUM(1-t) AS DOUBLE) n0, CAST(SUM((1-t)*picked) AS DOUBLE) s0
FROM lng GROUP BY 1,2,3),
f AS (SELECT *, n1+n0 AS N FROM st WHERE n1 >= 1 AND n0 >= 1)
SELECT var, COUNT(*) AS strata_k,
ROUND(100.0*SUM((s1*n0-s0*n1)/N)/SUM(n1*n0/N),3) AS mh_pp,
-- z 는 Greenland-Robins 분산
ROUND((SUM((s1*n0-s0*n1)/N)/SUM(n1*n0/N))
/ SQRT(SUM((s1*(n1-s1)*POWER(n0,3) + s0*(n0-s0)*POWER(n1,3))/(n1*n0*N*N))
/ POWER(SUM(n1*n0/N),2)), 1) AS z
FROM f GROUP BY var ORDER BY var;
-- 속성별 MH. 층 = 검색 x 스크롤 구간 x 용량비율 x "나머지 속성 전부"
WITH b AS (
SELECT search_id, pos, picked,
CASE WHEN cap_total/sum_len < 0.15 THEN 1 WHEN cap_total/sum_len < 0.30 THEN 2
WHEN cap_total/sum_len < 0.60 THEN 3 WHEN cap_total/sum_len < 1.00 THEN 4
WHEN cap_total/sum_len < 2.00 THEN 5 ELSE 6 END AS rb,
CASE WHEN n_container >= 8 THEN 1 ELSE 0 END A,
CASE WHEN n_marker >= 1 THEN 1 ELSE 0 END B,
CASE WHEN n_svg >= 8 THEN 1 ELSE 0 END D,
CASE WHEN view_item_has_image = 'true' THEN 1 ELSE 0 END E
FROM temp.mryu_temp.c4_item2
WHERE n_text IS NOT NULL AND sum_len IS NOT NULL AND sum_len > 0),
u AS ( SELECT 'SVG 8+' var, search_id,pos,rb, CONCAT(A,B,E) oth, D t, picked FROM b
UNION ALL SELECT '이미지 포함', search_id,pos,rb, CONCAT(A,B,D), E, picked FROM b
UNION ALL SELECT '마커 보유', search_id,pos,rb, CONCAT(A,D,E), B, picked FROM b
UNION ALL SELECT '컨테이너 8+', search_id,pos,rb, CONCAT(B,D,E), A, picked FROM b),
st AS (SELECT var, search_id, pos, rb, oth,
CAST(SUM(t) AS DOUBLE) n1, CAST(SUM(t*picked) AS DOUBLE) s1,
CAST(SUM(1-t) AS DOUBLE) n0, CAST(SUM((1-t)*picked) AS DOUBLE) s0
FROM u GROUP BY 1,2,3,4,5),
f AS (SELECT *, n1+n0 AS N FROM st WHERE n1 >= 1 AND n0 >= 1)
SELECT var, COUNT(*) strata_k,
ROUND(100.0*SUM(s1)/SUM(n1),2) p1, ROUND(100.0*SUM(s0)/SUM(n0),2) p0,
ROUND(100.0*SUM((s1*n0-s0*n1)/N)/SUM(n1*n0/N),3) mh_pp,
ROUND((SUM((s1*n0-s0*n1)/N)/SUM(n1*n0/N))
/ SQRT(SUM((s1*(n1-s1)*POWER(n0,3)+s0*(n0-s0)*POWER(n1,3))/(n1*n0*N*N))
/ POWER(SUM(n1*n0/N),2)),1) z
FROM f GROUP BY var ORDER BY var;
-- 랭킹 잔여 반박: 랭커가 이 속성을 상위에 올리는가
WITH r AS (SELECT search_id, view_item_key, MIN(CAST(view_load_seq AS INT)) rk
FROM temp.mryu_temp.cv_events
WHERE event_name = 'view_component' AND p_date >= '2026-08-01'
AND view_load_seq IS NOT NULL AND search_id IS NOT NULL
GROUP BY 1,2)
SELECT ROUND(AVG(CASE WHEN i.n_svg >= 8 THEN r.rk END),2) AS rank_svg8,
ROUND(AVG(CASE WHEN i.n_svg < 8 THEN r.rk END),2) AS rank_svg_lo
FROM temp.mryu_temp.c4_item2 i
JOIN r ON r.search_id = i.search_id AND r.view_item_key = i.view_item_key;
-- 16.12 vs 15.18 : 장식이 많은 쪽을 오히려 아래에 놓는다 (위치 설명과 반대)
-- ── 5차: 품질 대리 반박 ──
-- ① 템플릿 품질 = 그 템플릿의 「다른」 컴포넌트 채택률(자기 제외, 다른 노출 30건+)
WITH cs AS (SELECT c_tpl, view_item_key, SUM(picked) cp, COUNT(*) cn
FROM temp.mryu_temp.c4_item2 WHERE n_text IS NOT NULL GROUP BY 1,2),
ts AS (SELECT c_tpl, SUM(cp) tp, SUM(cn) tn FROM cs GROUP BY 1),
q AS (SELECT cs.c_tpl, cs.view_item_key,
CASE WHEN ts.tn-cs.cn >= 30 THEN (ts.tp-cs.cp)/(ts.tn-cs.cn+0.0) END loo
FROM cs JOIN ts USING (c_tpl))
-- 층 = search_id x pos x (나머지 속성) x NTILE(3) OVER (ORDER BY loo) 로 두고 위와 같은 MH
-- 일반 라우트: 장식 +1.15 → +0.39pp (z 5.1) · 이미지 +1.11 → +1.42pp (z 23.6)
-- ② 같은 템플릿 형제 — 검색을 가로지르므로 템플릿 군집 보정
-- 층 = pos x summary 길이 x 글머리 수 x 원문 줄 수 x (나머지 속성), 군집 = c_tpl
-- RD = Σ_t A_t / Σ_t B_t , Var = Σ_t (A_t − RD·B_t)² / (Σ_t B_t)² · T/(T−1)
-- (A_t = 템플릿 t 안의 Σ(s1·n0 − s0·n1)/N , B_t = Σ n1·n0/N)
-- 장식 +2.23pp (군집 z 5.3, 449 템플릿) · 이미지 +2.08pp (z 2.4, 280 템플릿)
-- 마커 보유 x 유저 타입. 층에 나머지 속성과 용량비율을 함께 넣는다
WITH b AS (
SELECT search_id, pos, picked, COALESCE(main_user_type,'(미상)') ut,
CASE WHEN cap_total/sum_len < 0.15 THEN 1 WHEN cap_total/sum_len < 0.30 THEN 2
WHEN cap_total/sum_len < 0.60 THEN 3 WHEN cap_total/sum_len < 1.00 THEN 4
WHEN cap_total/sum_len < 2.00 THEN 5 ELSE 6 END rb,
CASE WHEN n_svg >= 8 THEN 1 ELSE 0 END A,
CASE WHEN n_marker >= 1 THEN 1 ELSE 0 END B
FROM temp.mryu_temp.c4_item2
WHERE n_text IS NOT NULL AND sum_len IS NOT NULL AND sum_len > 0),
st AS (SELECT ut, search_id, pos, rb, A AS oth,
CAST(SUM(B) AS DOUBLE) n1, CAST(SUM(B*picked) AS DOUBLE) s1,
CAST(SUM(1-B) AS DOUBLE) n0, CAST(SUM((1-B)*picked) AS DOUBLE) s0
FROM b GROUP BY 1,2,3,4,5),
f AS (SELECT *, n1+n0 AS N FROM st WHERE n1 >= 1 AND n0 >= 1)
SELECT ut, COUNT(*) strata_k,
ROUND(100.0*SUM((s1*n0-s0*n1)/N)/SUM(n1*n0/N),3) mh_pp,
ROUND((SUM((s1*n0-s0*n1)/N)/SUM(n1*n0/N))
/ SQRT(SUM((s1*(n1-s1)*POWER(n0,3)+s0*(n0-s0)*POWER(n1,3))/(n1*n0*N*N))
/ POWER(SUM(n1*n0/N),2)),1) z
FROM f WHERE ut <> '(미상)' GROUP BY ut HAVING SUM(n1) >= 2000 ORDER BY mh_pp DESC;
-- 노출 순번 3칸 창으로 위치를 더 조여도 남는가 (+0.70pp, z=23.9)
-- 층 키를 (search_id, CEIL(rk/3.0), rb, oth) 로 바꿔 같은 식을 돌린다
-- 공급 카탈로그 3표의 세대 적재 상태
SELECT 'components' t, MAX(updated_date) mx, MAX(major) mj, COUNT(*) n
FROM bronze.miridih_miricanvas_designcontent_template.components
UNION ALL SELECT 'component_slots', MAX(updated_date), MAX(major), COUNT(*)
FROM bronze.miridih_miricanvas_designcontent_template.component_slots
UNION ALL SELECT 'component_embeddings', MAX(updated_date), MAX(major), COUNT(*)
FROM bronze.miridih_miricanvas_designcontent_template.component_embeddings;
-- slots 최종 갱신 2026-04-23 / major=1 · embeddings major=1 · components major=2 까지
-- 세대별 결손률
SELECT c.major, COUNT(*) n,
ROUND(100.0*AVG(CASE WHEN s.component_key IS NULL THEN 1 ELSE 0 END),1) AS slot_miss_pct,
ROUND(100.0*AVG(CASE WHEN e.component_key IS NULL THEN 1 ELSE 0 END),1) AS emb_miss_pct,
ROUND(100.0*AVG(CASE WHEN c.element_count IS NULL THEN 1 ELSE 0 END),1) AS ec_null_pct,
ROUND(100.0*AVG(CASE WHEN c.structure_json IS NULL OR c.structure_json = '' THEN 1 ELSE 0 END),1) AS sj_null_pct
FROM bronze.miridih_miricanvas_designcontent_template.components c
LEFT JOIN (SELECT DISTINCT component_key FROM
bronze.miridih_miricanvas_designcontent_template.component_slots) s
ON s.component_key = c.component_key
LEFT JOIN (SELECT DISTINCT component_key FROM
bronze.miridih_miricanvas_designcontent_template.component_embeddings) e
ON e.component_key = c.component_key
GROUP BY c.major ORDER BY c.major;
-- 노출된 항목이 어느 세대인가 (관측 창 전체가 v2)
WITH ev AS (SELECT DISTINCT view_item_key k FROM temp.mryu_temp.c4_item)
SELECT c.major, COUNT(*) n
FROM ev JOIN bronze.miridih_miricanvas_designcontent_template.components c
ON c.component_key = ev.k
GROUP BY c.major;
-- 위 '레버 A 공통 기반' 의 base 에 이어서
, seg AS (SELECT search_id, main_user_type FROM temp.mryu_temp.c2wide WHERE d IS NOT NULL),
b2 AS (SELECT b.search_id, b.pos, b.a_image, b.picked,
CASE WHEN s.main_user_type='STUDENT' THEN 'STUDENT' ELSE 'NOT_STUDENT' END AS seg
FROM base b JOIN seg s USING (search_id) WHERE s.main_user_type IS NOT NULL),
strata AS (
SELECT seg, search_id, pos,
SUM(CASE WHEN a_image=1 THEN 1 ELSE 0 END) AS n1,
SUM(CASE WHEN a_image=1 THEN picked ELSE 0 END) AS s1,
SUM(CASE WHEN a_image=0 THEN 1 ELSE 0 END) AS n0,
SUM(CASE WHEN a_image=0 THEN picked ELSE 0 END) AS s0
FROM b2 GROUP BY seg, search_id, pos)
SELECT seg, COUNT(*) AS strata_k,
SUM(n1) AS n_img, ROUND(SUM(s1)/SUM(n1)*100,3) AS pick_img_pct,
SUM(n0) AS n_noimg, ROUND(SUM(s0)/SUM(n0)*100,3) AS pick_noimg_pct,
ROUND(SUM((s1*n0-s0*n1)/(n1+n0))/SUM(n1*n0/(n1+n0))*100,3) AS mh_diff_pp,
ROUND(SUM((s1*n0-s0*n1)/(n1+n0))/SUM(n1*n0/(n1+n0))/(SUM(s0)/SUM(n0))*100,1) AS mh_rel_pct
FROM strata WHERE n1 >= 1 AND n0 >= 1 GROUP BY seg ORDER BY seg;
-- 실행 결과
-- NOT_STUDENT 35,248층 3.987% vs 3.246% → +0.831pp (+25.6%)
-- STUDENT 12,291층 2.681% vs 3.012% → −0.282pp ( −9.4%)
-- 공통 기반의 ranked/items 에 a_split 을 추가해 사용
-- CASE WHEN is_split_applied='true' THEN 1 ELSE 0 END AS a_split (rn=1 행에서)
WITH strata AS (
SELECT search_id, pos,
SUM(CASE WHEN a_split=1 THEN 1 ELSE 0 END) n1, SUM(CASE WHEN a_split=1 THEN picked ELSE 0 END) s1,
SUM(CASE WHEN a_split=0 THEN 1 ELSE 0 END) n0, SUM(CASE WHEN a_split=0 THEN picked ELSE 0 END) s0
FROM base GROUP BY search_id, pos)
SELECT COUNT(*) k, SUM(n1) n_t, ROUND(SUM(s1)/SUM(n1)*100,3) pct_t,
SUM(n0) n_c, ROUND(SUM(s0)/SUM(n0)*100,3) pct_c,
ROUND(SUM((s1*n0-s0*n1)/(n1+n0))/SUM(n1*n0/(n1+n0))*100,3) mh_pp,
ROUND(SUM((s1*n0-s0*n1)/(n1+n0))/SUM(n1*n0/(n1+n0))/(SUM(s0)/SUM(n0))*100,1) rel_pct
FROM strata WHERE n1 >= 1 AND n0 >= 1;
-- 실행 결과: 383층 · 5.765% vs 3.021% · +2.662pp (+88.1%)
-- 참고 - MAX() 집계로 바꾸면 379층 · +3.389pp (+130.6%) 로 부풀어 오른다
-- 같은 컴포넌트 안 「대치 가능 − 불가」 채택 차 : 8/4 색상 대치 Hue map 전후
WITH v AS (
SELECT search_id, view_item_key k, MIN(p_date) d, MAX(color_replacement_available) cra
FROM temp.mryu_temp.cv_events
WHERE event_name = 'view_component' AND p_date BETWEEN '2026-07-06' AND '2026-09-09'
AND p_date NOT BETWEEN '2026-07-27' AND '2026-08-09' -- v2 전환 · 8/10 오류 주 제외
AND p_date <> '2026-08-27' -- 검색 장애일
AND view_item_type NOT LIKE '%TABLE%' AND view_item_type NOT LIKE '%CHART%'
GROUP BY 1, 2),
a AS (SELECT DISTINCT search_id, action_item k FROM temp.mryu_temp.cv_events WHERE event_name = 'action_component'),
x AS (SELECT v.k, CASE WHEN v.d < '2026-07-27' THEN 'pre' ELSE 'post' END per,
CASE WHEN v.cra = 'true' THEN 1 ELSE 0 END t, CASE WHEN a.k IS NOT NULL THEN 1.0 ELSE 0.0 END y
FROM v LEFT JOIN a ON a.search_id = v.search_id AND a.k = v.k WHERE v.cra IN ('true', 'false')),
st AS (SELECT per, k, CAST(SUM(t) AS DOUBLE) n1, SUM(t*y) s1, CAST(SUM(1-t) AS DOUBLE) n0, SUM((1-t)*y) s0
FROM x GROUP BY 1, 2),
f AS (SELECT per, k, (s1*n0 - s0*n1)/(n1+n0) a_num, n1*n0/(n1+n0) b_den FROM st WHERE n1 >= 1 AND n0 >= 1)
SELECT per, COUNT(*) comps, ROUND(100 * SUM(a_num)/SUM(b_den), 2) gap_true_minus_false_pp
FROM f GROUP BY per;
-- 전 5,381 컴포넌트 −0.22pp (se 0.08) · 후 9,169 컴포넌트 −0.28pp (se 0.07) · 전후 차 −0.05pp (±0.2)
-- 대치 가능 노출 비율 33.1% → 70.0%
-- 공통 기반의 base 사용 (a_tc = view_item_type <> 'COMPONENT')
WITH strata AS (
SELECT search_id, pos,
SUM(CASE WHEN a_tc=1 THEN 1 ELSE 0 END) n1, SUM(CASE WHEN a_tc=1 THEN picked ELSE 0 END) s1,
SUM(CASE WHEN a_tc=0 THEN 1 ELSE 0 END) n0, SUM(CASE WHEN a_tc=0 THEN picked ELSE 0 END) s0
FROM base GROUP BY search_id, pos)
SELECT COUNT(*) k, SUM(n1) n_t, ROUND(SUM(s1)/SUM(n1)*100,3) pct_t,
SUM(n0) n_c, ROUND(SUM(s0)/SUM(n0)*100,3) pct_c,
ROUND(SUM((s1*n0-s0*n1)/(n1+n0))/SUM(n1*n0/(n1+n0))*100,3) mh_pp
FROM strata WHERE n1 >= 1 AND n0 >= 1;
-- 실행 결과: 1,197층 · 단순 합산 4.388% vs 4.542%(일반이 앞선다)
-- 그러나 층별로 짝지으면 MH +0.745pp · z=2.41 (부호가 돌아선다)
-- 왜 뒤집히는가: 결과 내 표·차트 비중으로 갈라 보면
SELECT CASE WHEN n1/(n1+n0) < 0.3 THEN 'A 표차트 <30%'
WHEN n1/(n1+n0) < 0.6 THEN 'B 30-60%' ELSE 'C 60%+' END AS share,
COUNT(*) k, SUM(n1+n0) items,
ROUND(100.0*SUM(s1+s0)/SUM(n1+n0),2) overall_pct,
ROUND(100.0*SUM(s1)/SUM(n1),2) tc, ROUND(100.0*SUM(s0)/SUM(n0),2) gen
FROM strata WHERE n1 >= 1 AND n0 >= 1 GROUP BY 1 ORDER BY 1;
-- A <30% 347층 전체 5.29% 표차트 8.04% 일반 4.78%
-- B 30-60% 383층 전체 4.10% 표차트 4.33% 일반 3.93%
-- C 60%+ 467층 전체 4.06% 표차트 3.68% 일반 5.37% ← 뒤집힌다
-- 표차트가 많이 섞인 검색일수록 전체 채택률이 낮고 항목 수가 많아 단순 합산의 분모를 지배한다
-- 공통 기반 s 에 이어서
, st AS (
SELECT cv_exp AS seg, k_len, k_line, k_mon,
SUM(CASE WHEN route='2 표차트' THEN 1 ELSE 0 END) AS n1,
SUM(CASE WHEN route='2 표차트' THEN adopted ELSE 0 END) AS s1,
SUM(CASE WHEN route<>'2 표차트' THEN 1 ELSE 0 END) AS n0,
SUM(CASE WHEN route<>'2 표차트' THEN adopted ELSE 0 END) AS s0
FROM s GROUP BY cv_exp, k_len, k_line, k_mon)
SELECT seg, COUNT(*) k, SUM(n1) n_t, ROUND(SUM(s1)/SUM(n1)*100,2) pct_t,
SUM(n0) n_c, ROUND(SUM(s0)/SUM(n0)*100,2) pct_c,
ROUND(SUM((s1*n0-s0*n1)/(n1+n0))/SUM(n1*n0/(n1+n0))*100,2) mh_pp,
ROUND(SUM((s1*n0-s0*n1)/(n1+n0))/SUM(n1*n0/(n1+n0))
/ SQRT(SUM((s1*(n1-s1)*POWER(n0,3)+s0*(n0-s0)*POWER(n1,3))/(n1*n0*POWER(n1+n0,2))))
* SUM(n1*n0/(n1+n0)),2) z
FROM st WHERE n1 >= 10 AND n0 >= 10 GROUP BY seg ORDER BY seg;
-- 실행 결과
-- a 1회 43.92% vs 26.13% → +14.08pp z= 9.66
-- b 2-5회 46.44% vs 37.84% → +5.17pp z= 5.58
-- c 6회+ 52.24% vs 51.93% → −0.99pp z=−1.14 (유의하지 않음)
-- H5 와 동일한 층화. seg 를 login_retention_type 으로, 결과를 survived 로 바꾼다
, st AS (SELECT login_retention_type AS seg, k_len, k_line, k_mon,
SUM(CASE WHEN route='2 표차트' THEN 1 ELSE 0 END) n1,
SUM(CASE WHEN route='2 표차트' THEN survived ELSE 0 END) s1,
SUM(CASE WHEN route<>'2 표차트' THEN 1 ELSE 0 END) n0,
SUM(CASE WHEN route<>'2 표차트' THEN survived ELSE 0 END) s0
FROM s WHERE login_retention_type IS NOT NULL GROUP BY 1,2,3,4)
-- 집계부는 H5 와 동일
-- 실행 결과
-- churn 25.16% vs 5.77% → +15.92pp z=3.99 (n=159, 참고용)
-- return 18.77% vs 9.47% → +8.27pp z=8.28
-- retain 14.86% vs 8.92% → +5.10pp z=11.23
-- new 13.78% vs 11.93% → +1.20pp z=0.88 (유의하지 않음)
-- H5 와 동일 구조. 처치를 n_line >= 3 으로, 층에서 k_line 을 빼고 route 를 넣는다
, st AS (SELECT cv_exp AS seg, k_len, route, k_mon,
SUM(CASE WHEN n_line >= 3 THEN 1 ELSE 0 END) n1,
SUM(CASE WHEN n_line >= 3 THEN adopted ELSE 0 END) s1,
SUM(CASE WHEN n_line < 3 THEN 1 ELSE 0 END) n0,
SUM(CASE WHEN n_line < 3 THEN adopted ELSE 0 END) s0
FROM s GROUP BY 1,2,3,4)
-- 실행 결과
-- a 1회 38.44% vs 22.96% → +9.89pp z=5.72
-- b 2-5회 46.72% vs 32.73% → +9.94pp z=8.15
-- c 6회+ 54.75% vs 47.50% → +4.68pp z=4.29
-- 원문은 GA 가 아니라 검색 요청 로그에 있다
WITH n AS (
SELECT c.adopted, c.survived, c.dl7, LENGTH(r.input_text) AS raw_len
FROM temp.mryu_temp.c2wide c
JOIN bronze.miridih_miricanvas_designcontent_template.component_search_request_log r
ON c.search_id = r.search_key
WHERE c.d IS NOT NULL AND r.created_date >= '2026-08-01')
SELECT CASE WHEN raw_len < 50 THEN 'a 50자 미만' WHEN raw_len < 150 THEN 'b 50-149'
WHEN raw_len < 300 THEN 'c 150-299' WHEN raw_len < 600 THEN 'd 300-599'
WHEN raw_len < 1500 THEN 'e 600-1499' ELSE 'f 1500자+' END AS len_band,
COUNT(*) n, ROUND(AVG(adopted)*100,1) adopt_pct,
ROUND(AVG(survived)*100,1) survive_pct, ROUND(AVG(dl7)*100,1) dl7_pct
FROM n GROUP BY 1 ORDER BY 1;
-- 실행 결과 n 채택 생존 7일내 다운로드
-- a 50자 미만 7,829 31.0% 7.2% 73.5%
-- b 50-149 8,993 49.5% 14.1% 75.2%
-- c 150-299 8,741 47.4% 12.0% 72.2%
-- d 300-599 4,808 49.6% 14.2% 75.3%
-- e 600-1499 2,153 45.8% 13.1% 72.0%
-- f 1500자+ 612 29.2% 6.4% 50.7%
-- 원문(input_text) 과 변환 결과(summary) 를 함께 놓고 본다
WITH n AS (
SELECT c.adopted, c.survived,
LENGTH(r.input_text) AS raw_len, LENGTH(r.summary) AS sum_len,
SIZE(SPLIT(r.summary, '(?m)^\\s*[*]')) - 1 AS sum_items,
SIZE(SPLIT(r.summary, '(?m)^##')) - 1 AS sum_h2,
CASE WHEN r.input_text RLIKE '(?m)^\\s*([-*•·]|[0-9]+[.)]|>>)' THEN 'c 글머리 기호'
WHEN SIZE(SPLIT(r.input_text, '\n')) >= 2 THEN 'b 줄바꿈만'
ELSE 'a 한 덩어리' END AS form
FROM temp.mryu_temp.c2wide c
JOIN bronze.miridih_miricanvas_designcontent_template.component_search_request_log r
ON c.search_id = r.search_key
WHERE c.d IS NOT NULL AND r.created_date >= '2026-08-01'
AND r.input_text IS NOT NULL AND r.summary IS NOT NULL)
SELECT form, COUNT(*) n,
ROUND(AVG(raw_len),0) AS raw_len, ROUND(AVG(sum_len),0) AS sum_len,
ROUND(AVG(sum_len/GREATEST(raw_len,1)),2) AS expand_x,
ROUND(AVG(sum_items),2) AS sum_items,
ROUND(AVG(CASE WHEN sum_h2 > 0 THEN 1.0 ELSE 0 END)*100,1) AS depth2_pct,
ROUND(AVG(adopted)*100,1) AS adopt_pct
FROM n GROUP BY 1 ORDER BY 1;
-- 실행 결과 n 원문 summary 확장 항목수 2단% 채택
-- a 한 덩어리 7,992 87자 384자 23.64 5.88 50.8% 32.0%
-- b 줄바꿈만 15,428 262자 489자 3.37 3.89 29.3% 49.1%
-- c 글머리 기호 9,716 398자 601자 2.58 8.40 54.9% 45.7%
-- 착시 확인 - 변환 결과의 복잡도를 고정하고 다시 본다
SELECT form,
CASE WHEN sum_items = 0 THEN 'i 0개' WHEN sum_items <= 3 THEN 'ii 1-3'
WHEN sum_items <= 7 THEN 'iii 4-7' WHEN sum_items <= 15 THEN 'iv 8-15'
ELSE 'v 16+' END AS items,
COUNT(*) n, ROUND(AVG(adopted)*100,1) AS adopt_pct
FROM n GROUP BY 1,2 HAVING COUNT(*) >= 150 ORDER BY 2,1;
-- 실행 결과 (채택률) 한 덩어리 줄바꿈 글머리
-- 0개 42.3% 54.0% 51.1%
-- 1-3 31.5% 43.4% 48.3%
-- 4-7 31.5% 53.6% 57.0%
-- 8-15 26.6% 40.6% 36.8%
-- 16+ 19.4% 26.8% 32.7%
-- → 복잡도를 고정하면 글머리가 줄바꿈보다 대체로 높다. 한 덩어리만 모든 구간에서 최저다
-- 변환된 구조는 request_log.summary 에 마크다운 형태로 저장된다
WITH n AS (
SELECT c.adopted, c.survived,
SIZE(SPLIT(r.summary, '(?m)^\\s*[*]')) - 1 AS n_bullet,
SIZE(SPLIT(r.summary, '(?m)^#')) - 1 AS n_head,
SIZE(SPLIT(r.summary, '(?m)^##')) - 1 AS n_h2
FROM temp.mryu_temp.c2wide c
JOIN bronze.miridih_miricanvas_designcontent_template.component_search_request_log r
ON c.search_id = r.search_key
WHERE c.d IS NOT NULL AND r.created_date >= '2026-08-01' AND r.summary IS NOT NULL)
SELECT CASE WHEN n_bullet = 0 THEN 'a 0개' WHEN n_bullet <= 3 THEN 'b 1-3개'
WHEN n_bullet <= 7 THEN 'c 4-7개' WHEN n_bullet <= 15 THEN 'd 8-15개'
ELSE 'e 16개+' END AS complexity,
COUNT(*) n, ROUND(AVG(adopted)*100,1) adopt_pct, ROUND(AVG(survived)*100,1) survive_pct
FROM n GROUP BY 1 ORDER BY 1;
-- 실행 결과 (항목 수) n 채택 생존
-- a 0개 10,502 51.5% 17.0%
-- b 1-3개 6,223 40.5% 10.3%
-- c 4-7개 7,333 49.2% 11.9%
-- d 8-15개 6,921 35.2% 6.9%
-- e 16개+ 2,157 27.8% 4.5%
-- 제목 단계 (n_head / n_h2 기준)
-- a 제목 없음 1,616 51.3% 12.4%
-- b 1단 17,602 49.4% 14.8%
-- c 2단 이상 13,918 36.3% 7.8%
, st AS (SELECT ppt_life AS seg, k_len, k_line, route, k_mon,
SUM(CASE WHEN n_text_pre >= 5 THEN 1 ELSE 0 END) n1,
SUM(CASE WHEN n_text_pre >= 5 THEN survived ELSE 0 END) s1,
SUM(CASE WHEN n_text_pre < 5 THEN 1 ELSE 0 END) n0,
SUM(CASE WHEN n_text_pre < 5 THEN survived ELSE 0 END) s0
FROM s GROUP BY 1,2,3,4,5)
-- 실행 결과
-- 0 없음 12.89% vs 8.10% → +4.33pp z= 5.55
-- b 1-9 11.82% vs 11.88% → −0.17pp z=−0.14
-- c 10-49 9.84% vs 8.83% → +0.88pp z= 0.70
-- d 50+ 9.67% vs 10.52% → −1.19pp z=−0.91
, st AS (SELECT cv_exp AS seg, k_len, k_line, route, k_mon,
SUM(CASE WHEN n_err > 0 THEN 1 ELSE 0 END) n1,
SUM(CASE WHEN n_err > 0 THEN survived ELSE 0 END) s1,
SUM(CASE WHEN n_err = 0 THEN 1 ELSE 0 END) n0,
SUM(CASE WHEN n_err = 0 THEN survived ELSE 0 END) s0
FROM s GROUP BY 1,2,3,4,5)
-- 실행 결과
-- b 2-5회 0.00% vs 8.16% → −8.33pp z=−21.26
-- c 6회+ 0.00% vs 15.97% → −15.24pp z=−30.45
-- 공통 기반의 win / edits 에 이어서
, per_adopt AS (
SELECT w.search_id, w.design_idx, w.ga_session_id, w.win_sec,
SUM(CASE WHEN e.event_time >= w.t_adopt
AND unix_timestamp(e.event_time) - unix_timestamp(w.t_adopt) <= w.win_sec
THEN 1 ELSE 0 END) AS win_edits
FROM win w LEFT JOIN edits e
ON e.design_idx = w.design_idx AND e.ga_session_id = w.ga_session_id
WHERE w.win_sec >= 120
GROUP BY 1,2,3,4),
srch AS ( -- 결과(생존)는 검색 단위이므로 검색으로 접는다
SELECT p.search_id, MAX(p.win_edits) AS win_edits, MIN(p.win_sec) AS win_sec,
MAX(c.survived) AS survived, MAX(c.dl7) AS dl7, MAX(c.acc) AS account_id
FROM per_adopt p JOIN temp.mryu_temp.c2wide c USING (search_id) GROUP BY 1),
st AS (
SELECT account_id,
CASE WHEN win_sec >= 1800 THEN 'd 30분' WHEN win_sec >= 600 THEN 'c 10-30분'
WHEN win_sec >= 300 THEN 'b 5-10분' ELSE 'a 2-5분' END AS k_win,
SUM(CASE WHEN win_edits < 5 THEN 1 ELSE 0 END) n1,
SUM(CASE WHEN win_edits < 5 THEN survived ELSE 0 END) s1,
SUM(CASE WHEN win_edits >= 5 THEN 1 ELSE 0 END) n0,
SUM(CASE WHEN win_edits >= 5 THEN survived ELSE 0 END) s0
FROM srch GROUP BY 1,2)
SELECT COUNT(*) k, SUM(n1) n_t, ROUND(SUM(s1)/SUM(n1)*100,2) pct_t,
SUM(n0) n_c, ROUND(SUM(s0)/SUM(n0)*100,2) pct_c,
ROUND(SUM((s1*n0-s0*n1)/(n1+n0))/SUM(n1*n0/(n1+n0))*100,2) mh_pp
FROM st WHERE n1 >= 1 AND n0 >= 1;
-- 실행 결과 (계정 + 창 길이 층화)
-- 생존 22.06% vs 25.99% → −11.27pp z=−7.07
-- 작업중단 33.33% vs 22.10% → +12.65pp z= 6.85
-- 공통 기반에 이어서, 창 안 첫 편집까지의 초를 잰다
, ttf AS (
SELECT w.search_id,
MIN(unix_timestamp(e.event_time) - unix_timestamp(w.t_adopt)) AS ttf_sec
FROM win w JOIN edits e
ON e.design_idx = w.design_idx AND e.ga_session_id = w.ga_session_id
WHERE w.win_sec >= 120
AND unix_timestamp(e.event_time) - unix_timestamp(w.t_adopt) BETWEEN 0 AND w.win_sec
GROUP BY 1)
SELECT CASE WHEN ttf_sec <= 10 THEN 'a 0-10초' WHEN ttf_sec <= 30 THEN 'b 11-30초'
WHEN ttf_sec <= 60 THEN 'c 31-60초' WHEN ttf_sec <= 180 THEN 'd 1-3분'
WHEN ttf_sec <= 600 THEN 'e 3-10분' ELSE 'f 10분+' END AS band,
COUNT(*) n,
ROUND(AVG(c.survived)*100,2) AS survive_pct,
ROUND(AVG(CASE WHEN c.survived=0 AND c.dl7=0 THEN 1.0 ELSE 0 END)*100,2) AS stop_pct
FROM ttf JOIN temp.mryu_temp.c2wide c USING (search_id) GROUP BY 1 ORDER BY 1;
-- 실행 결과
-- a 0-10초 5,588 24.00% 20.72%
-- b 11-30초 4,930 25.66% 20.18%
-- c 31-60초 1,423 23.33% 22.14%
-- d 1-3분 1,090 19.91% 24.77%
-- e 3-10분 182 15.93% 23.63%
-- f 10분+ 57 24.56% 29.82%
-- 레버 E 공통 기반의 win_edits(채택 직후 귀속 창 안의 편집 횟수) 사용
SELECT CASE WHEN win_edits >= 200 THEN 'e 200회+' WHEN win_edits >= 60 THEN 'd 60-199'
WHEN win_edits >= 20 THEN 'c 20-59' WHEN win_edits >= 5 THEN 'b 5-19'
ELSE 'a 5회 미만' END AS edits_after,
COUNT(*) n,
ROUND(AVG(survived)*100,1) AS survive_pct,
ROUND(AVG(dl7)*100,1) AS dl7_pct,
ROUND(AVG(CASE WHEN survived=0 AND dl7=0 THEN 1.0 ELSE 0 END)*100,1) AS stop_pct
FROM temp.mryu_temp.c3_search WHERE d <= '2026-09-02' GROUP BY 1 ORDER BY 1;
-- 실행 결과 n 생존 다운로드 작업중단
-- a 5회 미만 1,084 21.3% 63.2% 36.1%
-- b 5-19 1,623 31.0% 75.9% 23.0%
-- c 20-59 3,027 28.9% 82.0% 17.5%
-- d 60-199 4,205 18.8% 83.7% 15.8%
-- e 200회+ 465 15.9% 81.7% 17.6%
-- 편집 명령을 종류로 묶고, 계정을 층으로 삼아 두 결과를 각각 잰다
-- 레이아웃 = Resize|Move|Rotate|Align|ChangeItemOrder
-- 텍스트 = NodeTextEditCommand, SimpleTextInputAction
-- 색 = ColorMap 계열
, sig AS (
SELECT search_id, account_id, survived,
CASE WHEN survived=0 AND dl7=0 THEN 1 ELSE 0 END AS stop,
MAX(CASE WHEN action_name RLIKE 'Resize|Move|Rotate|Align|ChangeItemOrder'
THEN 1 ELSE 0 END) AS layout300
FROM per_adopt_300 -- 위 공통 기반의 per_adopt 를 창 300초로 제한한 것
GROUP BY 1,2,3,4),
st AS (SELECT account_id,
SUM(CASE WHEN layout300=1 THEN 1 ELSE 0 END) n1, SUM(CASE WHEN layout300=1 THEN stop ELSE 0 END) s1,
SUM(CASE WHEN layout300=0 THEN 1 ELSE 0 END) n0, SUM(CASE WHEN layout300=0 THEN stop ELSE 0 END) s0
FROM sig GROUP BY 1)
-- 집계부는 H11 과 동일
-- 실행 결과 (계정 고정효과)
-- 레이아웃 조정 → 생존 28.3% vs 26.2% → +5.61pp z= 4.71
-- 레이아웃 조정 → 작업중단 17.9% vs 25.2% → −6.21pp z=−5.29
-- 텍스트 대치 → 생존 27.6% vs 24.7% → +3.49pp z= 4.17
-- 텍스트 대치 → 작업중단 16.5% vs 20.5% → −3.34pp z=−4.70
-- 색 변경 → 생존 +1.06pp z= 1.65 (유의하지 않음)
, st AS (SELECT dl_life AS seg, k_len, k_line, route, k_mon,
SUM(CASE WHEN recent_click > 0 THEN 1 ELSE 0 END) n1,
SUM(CASE WHEN recent_click > 0 THEN survived ELSE 0 END) s1,
SUM(CASE WHEN recent_click = 0 THEN 1 ELSE 0 END) n0,
SUM(CASE WHEN recent_click = 0 THEN survived ELSE 0 END) s0
FROM s GROUP BY 1,2,3,4,5)
-- 실행 결과
-- 0 없음 19.27% vs 11.98% → +6.54pp z= 5.97
-- b 3-19 19.67% vs 10.28% → +8.25pp z= 4.44
-- c 20+ 8.30% vs 10.06% → −2.23pp z=−2.17
SELECT nudge, views, clicks, ROUND(clicks/views*100,2) AS ctr_pct
FROM (
SELECT CASE
WHEN log_type LIKE '%외부데이터붙여넣기_넛지%' THEN '외부데이터 붙여넣기'
WHEN log_type LIKE '%에디터_표속성_넛지%' THEN '에디터 표속성'
WHEN log_type LIKE '%추가구좌_표_넛지%' THEN '표'
WHEN log_type LIKE '%추가구좌_요소_드롭다운_넛지%' THEN '요소 드롭다운'
WHEN log_type LIKE '%추가구좌_요소_넛지%' THEN '요소'
WHEN log_type LIKE '%추가구좌_차트_넛지%' THEN '차트'
WHEN log_type LIKE '%추가구좌_템플릿_드롭다운_넛지%' THEN '템플릿 드롭다운'
WHEN log_type LIKE '%추가구좌_템플릿_넛지%' THEN '템플릿' END AS nudge,
SUM(CASE WHEN log_type LIKE '%_뷰' THEN 1 ELSE 0 END) AS views,
SUM(CASE WHEN log_type LIKE '%_클릭' THEN 1 ELSE 0 END) AS clicks
FROM temp.mryu_temp.cv_ui WHERE log_type LIKE '%넛지%' GROUP BY 1)
WHERE nudge IS NOT NULL AND views > 100 ORDER BY ctr_pct DESC;
-- 실행 결과
-- 외부데이터 붙여넣기 24,883 → 1,813 7.29%
-- 에디터 표속성 28,207 → 1,829 6.48%
-- 표 16,594 → 922 5.56%
-- 요소 6,057 → 263 4.34%
-- 템플릿 435 → 15 3.45%
-- 차트 8,886 → 150 1.69%
-- 요소 드롭다운 13,064 → 51 0.39%
-- 템플릿 드롭다운 5,052 → 19 0.38%
WITH seg AS (
SELECT acc AS account_id,
CASE WHEN MAX(login_days_30d) >= 15 THEN 'c 15일+'
WHEN MAX(login_days_30d) >= 5 THEN 'b 5-14일'
WHEN MAX(login_days_30d) >= 1 THEN 'a 1-4일' END AS login30,
CASE WHEN MAX(acc_searches) >= 6 THEN 'c 6회+'
WHEN MAX(acc_searches) >= 2 THEN 'b 2-5회' ELSE 'a 1회' END AS cv_exp
FROM temp.mryu_temp.c2wide GROUP BY acc),
v AS (SELECT account_id, COUNT(*) views FROM temp.mryu_temp.cv_ui
WHERE log_type='에디터뷰데이터시각화_추가구좌_에디터_표속성_넛지_뷰' GROUP BY 1),
c AS (SELECT account_id, COUNT(*) clicks FROM temp.mryu_temp.cv_ui
WHERE log_type='에디터클릭데이터시각화_추가구좌_에디터_표속성_넛지_클릭' GROUP BY 1)
SELECT seg.login30, COUNT(*) accts, SUM(v.views) V, SUM(COALESCE(c.clicks,0)) C,
ROUND(SUM(COALESCE(c.clicks,0))/SUM(v.views)*100,2) AS ctr_per_view,
ROUND(AVG(CASE WHEN c.clicks > 0 THEN 1.0 ELSE 0 END)*100,1) AS ever_clicked_pct,
ROUND(AVG(v.views),2) AS views_per_acct
FROM v LEFT JOIN c USING (account_id) JOIN seg USING (account_id)
WHERE seg.login30 IS NOT NULL GROUP BY 1 ORDER BY 1;
-- 실행 결과 (에디터 표속성 넛지)
-- 계정 계정당노출 노출당CTR 생애1회+클릭
-- a 1-4일 403 3.33 25.09% 46.2%
-- b 5-14일 1,054 4.31 15.91% 39.5%
-- c 15일+ 1,335 5.50 9.68% 30.8%
-- CV 경험량 축은 반대: 1회 7.83% → 2-5회 12.62% → 6회+ 23.57%
-- dl7 은 다운로드 로그 최종일 −7일까지만 관측 가능하다 (여기서는 2026-09-02)
SELECT COALESCE(main_user_type,'전체') AS seg, COUNT(*) AS n,
ROUND(AVG(CASE WHEN survived=1 THEN 1.0 ELSE 0 END)*100,1) AS 생존,
ROUND(AVG(CASE WHEN survived=0 AND dl7=1 THEN 1.0 ELSE 0 END)*100,1) AS 버려짐,
ROUND(AVG(CASE WHEN survived=0 AND dl7=0 THEN 1.0 ELSE 0 END)*100,1) AS 작업중단
FROM temp.mryu_temp.c2wide
WHERE d IS NOT NULL AND d <= '2026-09-02'
GROUP BY ROLLUP(main_user_type) HAVING COUNT(*) >= 400;
-- 실행 결과 (전체 10,404건): 생존 23.8% / 버려짐 56.6% / 작업중단 19.6%
-- H17 과 같은 쿼리의 타입별 행
-- 실행 결과 n 생존 버려짐 작업중단
-- BUSINESS 553 31.3% 49.7% 19.0%
-- STUDENT 2,709 25.1% 60.0% 15.0%
-- EDUCATION 1,721 23.8% 50.1% 26.1%
-- INDIVIDUAL 1,830 23.3% 55.6% 21.1%
-- INSTITUTION 1,385 22.7% 58.6% 18.7%
-- COMPANY 1,937 20.7% 60.0% 19.4%
SELECT CASE WHEN scroll_depth >= 5 THEN 'e 5회+(상한)'
ELSE CONCAT(CAST(scroll_depth AS STRING), '회') END AS scrolls,
COUNT(*) n,
ROUND(AVG(adopted)*100,1) AS adopt_pct,
ROUND(AVG(survived)*100,1) AS survive_pct,
ROUND(AVG(dl7)*100,1) AS dl7_pct
FROM temp.mryu_temp.c2wide
WHERE d IS NOT NULL AND scroll_depth BETWEEN 1 AND 9 GROUP BY 1 ORDER BY 1;
-- 실행 결과 n 채택 생존 다운로드
-- 1회 10,441 38.1% 11.1% 73.5%
-- 2회 7,237 48.6% 12.3% 74.6%
-- 3회 4,646 51.2% 13.2% 74.3%
-- 4회 2,658 54.4% 13.5% 74.1%
-- 5회+(상한) 5,688 57.1% 15.1% 71.3%
, st AS (
SELECT concat(CASE WHEN team_idx IS NULL THEN '무팀' ELSE '팀' END, ' / ',
CASE WHEN n_pay > 0 THEN '결제' WHEN n_trial > 0 THEN '트라이얼'
ELSE '무결제' END) AS seg,
k_len, k_line, route,
SUM(CASE WHEN src_tpl IS NOT NULL THEN 1 ELSE 0 END) n1,
SUM(CASE WHEN src_tpl IS NOT NULL THEN dl7 ELSE 0 END) s1,
SUM(CASE WHEN src_tpl IS NULL THEN 1 ELSE 0 END) n0,
SUM(CASE WHEN src_tpl IS NULL THEN dl7 ELSE 0 END) s0
FROM s WHERE d <= '2026-09-02' GROUP BY 1,2,3,4)
-- 실행 결과
-- 팀 / 무결제 70.3% vs 54.1% → +16.12pp z= 7.72
-- 팀 / 트라이얼 81.2% vs 68.6% → +12.68pp z= 7.82
-- 팀 / 결제 79.7% vs 68.0% → +11.61pp z=14.80
-- 무팀 / 트라이얼 76.9% vs 72.4% → +5.30pp z= 1.41 (유의하지 않음)
-- 무팀 / 결제 75.4% vs 70.5% → +5.15pp z= 2.55
SELECT scroll_depth, COUNT(*) AS n,
ROUND(AVG(n_item),1) AS avg_items,
CONCAT(MIN(n_item),'-',MAX(n_item)) AS range_items
FROM temp.mryu_temp.c2wide
WHERE d IS NOT NULL AND scroll_depth BETWEEN 1 AND 5
GROUP BY scroll_depth ORDER BY scroll_depth;
-- 실행 결과
-- 1 10,441 6.8 (1-80)
-- 2 7,237 17.1 (5-73)
-- 3 4,646 28.0 (6-197)
-- 4 2,658 38.6 (9-127)
-- 5 5,688 53.1 (7-254)
, st AS (SELECT cv_exp AS seg, k_len, k_line, route, k_mon,
SUM(CASE WHEN split='true' THEN 1 ELSE 0 END) n1,
SUM(CASE WHEN split='true' THEN adopted ELSE 0 END) s1,
SUM(CASE WHEN split<>'true' THEN 1 ELSE 0 END) n0,
SUM(CASE WHEN split<>'true' THEN adopted ELSE 0 END) s0
FROM s GROUP BY 1,2,3,4,5)
-- 실행 결과
-- a 1회 23.08% vs 27.47% → −8.98pp z= −4.65
-- b 2-5회 32.36% vs 40.70% → −11.59pp z= −7.51
-- c 6회+ 40.48% vs 54.68% → −14.12pp z=−10.10
SELECT CASE WHEN sec_since_first_edit IS NULL THEN 'z 편집 없음'
WHEN sec_since_first_edit < 60 THEN 'a 1분 미만'
WHEN sec_since_first_edit < 300 THEN 'b 1-5분'
WHEN sec_since_first_edit < 1800 THEN 'c 5-30분'
WHEN sec_since_first_edit < 7200 THEN 'd 30분-2시간'
ELSE 'e 2시간+' END AS elapsed,
COUNT(*) n, ROUND(AVG(adopted)*100,1) adopt_pct,
ROUND(AVG(survived)*100,1) survive_pct, ROUND(AVG(dl7)*100,1) dl7_pct
FROM temp.mryu_temp.c2wide WHERE d IS NOT NULL GROUP BY 1 ORDER BY 1;
-- 실행 결과 n 채택 생존 다운로드
-- a 1분 미만 835 40.6% 10.2% 47.5%
-- b 1-5분 2,149 39.6% 9.6% 57.4%
-- c 5-30분 9,823 42.6% 11.3% 70.9%
-- d 30분-2시간 16,318 44.7% 12.1% 76.7%
-- e 2시간+ 3,958 47.5% 12.6% 79.9%
-- z 편집 없음 58 29.3% 0.0% 22.4%
-- 각 활동은 겹칠 수 있으므로 조건별로 따로 센다
SELECT '1 템플릿 탐색' AS act, COUNT(*) n, ROUND(AVG(adopted)*100,1) adopt_pct,
ROUND(AVG(survived)*100,1) survive_pct, ROUND(AVG(dl7)*100,1) dl7_pct
FROM temp.mryu_temp.c2wide WHERE d IS NOT NULL AND n_tpl_pre >= 1
UNION ALL SELECT '2 AI 기능 사용', COUNT(*), ROUND(AVG(adopted)*100,1),
ROUND(AVG(survived)*100,1), ROUND(AVG(dl7)*100,1)
FROM temp.mryu_temp.c2wide WHERE d IS NOT NULL AND n_ai_pre >= 1
UNION ALL SELECT '3 표·차트 편집', COUNT(*), ROUND(AVG(adopted)*100,1),
ROUND(AVG(survived)*100,1), ROUND(AVG(dl7)*100,1)
FROM temp.mryu_temp.c2wide WHERE d IS NOT NULL AND n_tbl_chart_pre >= 1
UNION ALL SELECT '5 아무것도 안 함', COUNT(*), ROUND(AVG(adopted)*100,1),
ROUND(AVG(survived)*100,1), ROUND(AVG(dl7)*100,1)
FROM temp.mryu_temp.c2wide WHERE d IS NOT NULL AND COALESCE(n_edit_pre,0) = 0;
-- 실행 결과 n 채택 생존 다운로드
-- 1 템플릿 탐색 24,005 43.9% 11.8% 72.5%
-- 2 AI 기능 사용 30,634 44.2% 11.8% 73.9%
-- 3 표·차트 편집 10,507 47.4% 14.3% 78.2%
-- 4 텍스트 편집만 834 41.6% 9.8% 74.9%
-- 5 아무것도 안 함 398 41.7% 8.0% 41.0%
-- 출발 템플릿(source_template) 에 업종 라벨을 붙인다. rank=1 이 대표 업종
SELECT COALESCE(m.industry_name, '(라벨 없음)') AS industry, COUNT(*) n,
ROUND(AVG(c.adopted)*100,1) AS adopt_pct,
ROUND(AVG(c.survived)*100,1) AS survive_pct,
ROUND(AVG(c.dl7)*100,1) AS dl7_pct
FROM temp.mryu_temp.c2wide c
LEFT JOIN (SELECT CAST(template_idx AS STRING) ti, industry_name,
ROW_NUMBER() OVER (PARTITION BY template_idx ORDER BY rank) rn
FROM gold.profile.mdi_template_industry) m
ON c.src_tpl = m.ti AND m.rn = 1
WHERE c.d IS NOT NULL AND c.src_tpl IS NOT NULL
GROUP BY 1 HAVING COUNT(*) >= 250 ORDER BY n DESC;
-- 실행 결과 (일부) n 채택 생존
-- 업종 범용 > 기획안/보고서/제안서 12,842 45.4% 12.5%
-- 교육/커리어 > 학교 > 초/중/고등학교 1,813 42.7% 8.7%
-- 기업/비즈니스 > 기타전문직/프리랜서 999 36.9% 8.5%
-- IT/테크 > IT/웹/데이터 771 44.0% 8.3%
-- 부동산/건축/환경 > 신재생에너지/ESG 359 51.8% 13.1%
-- 공공/기관 > 중앙정부/지자체 341 43.7% 16.4%
-- 의료/건강 > 병원/의원/의료기관 306 45.1% 18.6%
-- 교육/커리어 > 일반학습학원 304 40.8% 6.6%