looker-studio-bigquery
npx skills add https://github.com/supercent-io/skills-template --skill looker-studio-bigquery
Agent 安装分布
Skill 文档
Looker Studio BigQuery Integration
When to use this skill
- ë¶ì ëìë³´ë ìì±: BigQuery ë°ì´í°ë¥¼ ìê°ííì¬ ë¹ì¦ëì¤ ì¸ì¬ì´í¸ ëì¶
- ì¤ìê° ë¦¬í¬í : ìë ìë¡ê³ 침ëë ëìë³´ë 구ì¶
- ì±ë¥ ìµì í: ëì©ë ë°ì´í°ì ì 쿼리 ë¹ì© ë° ë¡ë© ìê° ìµì í
- ë°ì´í° íì´íë¼ì¸: ì¤ì¼ì¤ë ì¿¼ë¦¬ë¡ ETL íë¡ì¸ì¤ ìëí
- í íì : ê³µì ê°ë¥í ì¸í°ëí°ë¸ ëìë³´ë 구ì¶
Instructions
Step 1: GCP BigQuery íê²½ ì¤ë¹
íë¡ì í¸ ìì± ë° íì±í
Google Cloud Consoleìì ì íë¡ì í¸ë¥¼ ìì±íê³ BigQuery API를 íì±íí©ëë¤.
# gcloud CLI를 ì¬ì©í íë¡ì í¸ ìì±
gcloud projects create my-analytics-project
gcloud config set project my-analytics-project
gcloud services enable bigquery.googleapis.com
ë°ì´í°ì ë° í ì´ë¸ ìì±
-- ë°ì´í°ì
ìì±
CREATE SCHEMA `my-project.analytics_dataset`
OPTIONS(
description="ë¶ìì© ë°ì´í°ì
",
location="US"
);
-- ìì í
ì´ë¸ ìì± (GA4 ë°ì´í°)
CREATE TABLE `my-project.analytics_dataset.events` (
event_date DATE,
event_name STRING,
user_id INT64,
event_value FLOAT64,
event_timestamp TIMESTAMP,
geo_country STRING,
device_category STRING
);
IAM ê¶í ì¤ì
Looker Studioìì BigQueryì ì ê·¼í ì ìëë¡ IAM ê¶íì ë¶ì¬í©ëë¤:
| ìí | ì¤ëª |
|---|---|
BigQuery Data Viewer |
í ì´ë¸ ì¡°í ê¶í |
BigQuery User |
쿼리 ì¤í ê¶í |
BigQuery Job User |
ìì ì¤í ê¶í |
Step 2: Looker Studioìì BigQuery ì°ê²°í기
ë¤ì´í°ë¸ BigQuery 커ë¥í° ì¬ì© (ê¶ì¥)
- Looker Studio ííì´ì§ìì + ë§ë¤ê¸° â ë°ì´í° ìì¤ í´ë¦
- “BigQuery”ë¡ ê²ìíì¬ Google BigQuery 커ë¥í° ì í
- Google ê³ì ì¼ë¡ ì¸ì¦
- íë¡ì í¸, ë°ì´í°ì , í ì´ë¸ ì í
- ì°ê²°ì í´ë¦íì¬ ë°ì´í° ìì¤ ìì±
ë§ì¶¤ SQL 쿼리 ë°©ì
ë³µì¡í ë°ì´í° ë³íì´ íìí ë SQLì ì§ì ìì±í©ëë¤:
SELECT
event_date,
event_name,
COUNT(DISTINCT user_id) as unique_users,
SUM(event_value) as total_revenue,
AVG(event_value) as avg_revenue_per_event
FROM `my-project.analytics_dataset.events`
WHERE event_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
GROUP BY event_date, event_name
ORDER BY event_date DESC
ì¥ì :
- ë³µì¡í ë°ì´í° ë³íì SQLìì ì²ë¦¬
- BigQueryìì ë°ì´í°ë¥¼ 미리 ì§ê³íì¬ ì¿¼ë¦¬ ë¹ì© ì ê°
- ë§¤ë² ëª¨ë ë°ì´í°ë¥¼ ë¡ëíì§ ìì ì±ë¥ í¥ì
ì¬ë¬ í ì´ë¸ ì¡°ì¸ ë°©ì
SELECT
e.event_date,
e.event_name,
u.user_country,
u.user_tier,
COUNT(DISTINCT e.user_id) as unique_users,
SUM(e.event_value) as revenue
FROM `my-project.analytics_dataset.events` e
LEFT JOIN `my-project.analytics_dataset.users` u
ON e.user_id = u.user_id
WHERE e.event_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY)
GROUP BY e.event_date, e.event_name, u.user_country, u.user_tier
Step 3: ì¤ì¼ì¤ë ì¿¼ë¦¬ë¡ ì±ë¥ ìµì í
ë¼ì´ë¸ 쿼리 ëì ì¤ì¼ì¤ë 쿼리를 ì¬ì©íì¬ ì£¼ê¸°ì ì¼ë¡ ë°ì´í°ë¥¼ 미리 ê³ì°í©ëë¤:
-- BigQueryìì ë§¤ì¼ ì§ê³ ë°ì´í°ë¥¼ ê³ì°íì¬ ì ì¥
CREATE OR REPLACE TABLE `my-project.analytics_dataset.daily_summary` AS
SELECT
CURRENT_DATE() as report_date,
event_name,
user_country,
COUNT(DISTINCT user_id) as daily_users,
SUM(event_value) as daily_revenue,
AVG(event_value) as avg_event_value,
MAX(event_timestamp) as last_event_time
FROM `my-project.analytics_dataset.events`
WHERE event_date = CURRENT_DATE() - 1
GROUP BY event_name, user_country
BigQuery UIìì ì¤ì¼ì¤ë ì¿¼ë¦¬ë¡ ì¤ì :
- ë§¤ì¼ ìë ì¤í
- 결과를 ìë¡ì´ í ì´ë¸ì ì ì¥
- Looker Studioë 미리 ê³ì°ë í ì´ë¸ì ì°ê²°
ì¥ì :
- Looker Studio ë¡ë© ìê° ë¨ì¶ (50-80%)
- BigQuery ë¹ì© ì ê° (ì¤ìº ë°ì´í° ê°ì)
- ëìë³´ë ìë¡ê³ 침 ìë í¥ì
Step 4: ëìë³´ë ë ì´ìì ì¤ê³
F-í¨í´ ë ì´ìì
ì¬ì©ìì ìì°ì¤ë¬ì´ ì½ê¸° íë¦ì ë°ë¥´ë F-í¨í´ì ì¬ì©í©ëë¤:
âââââââââââââââââââââââââââââââââââââââ
â í¤ë: ë¡ê³ | íí°/ë ì§ì í기 â â ì¬ì©ìê° ë¨¼ì 본ë¤
âââââââââââââââââââââââââââââââââââââââ¤
â KPI 1 â KPI 2 â KPI 3 â KPI 4 â â íµì¬ ì§í (3-4ê°)
âââââââââââââââââââââââââââââââââââââââ¤
â â
â 주ì ì°¨í¸ (ìê³ì´ ëë ë¹êµ) â â ê¹ì´ ìë ì¸ì¬ì´í¸
â â
âââââââââââââââââââââââââââââââââââââââ¤
â 구체ì ë°ì´í° í
ì´ë¸ â â ìì¸ ë¶ì
â (ë릴ë¤ì´ ê°ë¥) â
âââââââââââââââââââââââââââââââââââââââ¤
â ì¶ê° ì¸ì¬ì´í¸ / ë§µ / íí¸ë§µ â
âââââââââââââââââââââââââââââââââââââââ
ëìë³´ë êµ¬ì± ìì
| ìì | 목ì | ìì |
|---|---|---|
| í¤ë | ëìë³´ë ì 목, ë¡ê³ , íí° ë°°ì¹ | “2026ë Q1 í매 ë¶ì” |
| KPI íì¼ | 주ì ì§í íëì íì | ì´ ë§¤ì¶, ì ì ëë¹ ì±ì¥ë¥ , íì± ì¬ì©ì |
| ì¶ì¸ ì°¨í¸ | ìê° ê²½ê³¼ì ë°ë¥¸ ë³í | ë¼ì¸ ì°¨í¸ë¡ ì¼ì¼/ì£¼ê° ë§¤ì¶ ì¶ì´ |
| ë¹êµ ì°¨í¸ | ì¹´í ê³ ë¦¬ ê° ë¹êµ | ë§ë ì°¨í¸ë¡ ì§ì/ìíë³ í매ë ë¹êµ |
| ë¶í¬ ì°¨í¸ | ë°ì´í° ë¶í¬ ìê°í | íí¸ë§µ, ì°ì ë, ë²ë¸ ì°¨í¸ |
| ìì¸ í ì´ë¸ | ì íí ìì¹ ì ê³µ | ì¡°ê±´ë¶ ììì¼ë¡ ìê³ê° ê°ì¡° |
| ë§µ | ì§ë¦¬ì ë°ì´í° | êµê°/ì§ìë³ ë§¤ì¶ ë¶í¬ |
ì¤ì ìì: ì ììê±°ë ëìë³´ë
ââââââââââââââââââââââââââââââââââââââââââââââââââââ
â ð 2026ë
1ì í매 ë¶ì | ð½ êµê° ì í | ð
ë ì§ â
ââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â ì´ ë§¤ì¶: $125,000 â 주문ì: 3,200 â ì íì¨: 3.5% â
ââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â ì¼ì¼ ë§¤ì¶ ì¶ì´ (ë¼ì¸ ì°¨í¸) â
â â ìì¹ ì¶ì¸: +15% vs ì§ëë¬ â
ââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â ì¹´í
ê³ ë¦¬ë³ í매 â ìì ì í Top 10 â
â (ë§ë ì°¨í¸) â (í
ì´ë¸, ì ë ¬ ê°ë¥) â
ââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â ì§ìë³ ë§¤ì¶ ë¶í¬ (ë§µ) â
ââââââââââââââââââââââââââââââââââââââââââââââââââââ
Step 5: ì¸í°ëí°ë¸ íí° ë° ì»¨í¸ë¡¤
íí° ì¢ ë¥
1. ë ì§ ë²ì íí° (íì)
- ìºë¦°ëë¡ í¹ì ê¸°ê° ì í
- “ì§ë 7ì¼”, “ì´ë² 묔 ê°ì ì¬ì ì ì ìµì
- ë°ì´í°ì ê³¼ ì°ê²°íì¬ ëª¨ë ì°¨í¸ì ìë ë°ì
2. ëë¡ë¤ì´ íí°
ì: êµê° ì í íí°
- 모ë êµê°
- íêµ
- ì¼ë³¸
- 미êµ
ì ííë©´ í´ë¹ êµê° ë°ì´í°ë§ íì
3. ê³ ê¸ íí° (SQL 기ë°)
-- 매ì¶ì¡ì´ $10,000 ì´ìì¸ ê³ ê°ë§ íì
WHERE customer_revenue >= 10000
íí° êµ¬í ìì
-- 1. ë ì§ íí°
event_date >= DATE_SUB(CURRENT_DATE(), INTERVAL @date_range_days DAY)
-- 2. ëë¡ë¤ì´ íí° (ì¬ì©ì ì
ë ¥)
WHERE country = @selected_country
-- 3. ë³µí© íí°
WHERE event_date >= @start_date
AND event_date <= @end_date
AND country IN (@country_list)
AND revenue >= @min_revenue
Step 6: 쿼리 ì±ë¥ ìµì í
1. íí°ì í¤ ì¬ì©
-- â ë¹í¨ì¨ì ì¸ ì¿¼ë¦¬
SELECT * FROM events
WHERE DATE(event_timestamp) >= '2026-01-01'
-- â
ìµì íë 쿼리 (íí°ì
ì¬ì©)
SELECT * FROM events
WHERE event_date >= '2026-01-01' -- íí°ì
í¤ ì§ì ì¬ì©
2. ë°ì´í° ì¶ì¶ (Extract and Load)
ë§¤ì¼ ë°¤ Looker Studio ì ì© í ì´ë¸ì ë°ì´í°ë¥¼ ì¶ì¶í©ëë¤:
-- ë§¤ì¼ ìì ì ì¤íëë ì¤ì¼ì¤ 쿼리
CREATE OR REPLACE TABLE `my-project.looker_studio_data.dashboard_snapshot` AS
SELECT
event_date,
event_name,
country,
device_category,
COUNT(DISTINCT user_id) as users,
SUM(event_value) as revenue,
COUNT(*) as events
FROM `my-project.analytics_dataset.events`
WHERE event_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY)
GROUP BY event_date, event_name, country, device_category;
3. ìºì± ì ëµ
- Looker Studio 기본 ìºì±: ìëì¼ë¡ 3ìê° ëì ìºì
- BigQuery ìºì±: ëì¼í 쿼리ë ì´ì ê²°ê³¼ ì¬ì¬ì© (6ìê°)
- ì¤ì¼ì¤ë 쿼리 íì©: ì¼ê°ì 미리 ê³ì°
4. ëìë³´ë ë³µì¡ë ê´ë¦¬
- í ëìë³´ëì ìµë 20-25ê° ì°¨í¸ë§ ì¬ì©
- ì°¨í¸ê° ë§ì¼ë©´ ì¬ë¬ í(íì´ì§)ì¼ë¡ ë¶ì°
- ìê´ìë ë©í¸ë¦ë¼ë¦¬ 그룹ííì§ ì기
Step 7: Community Connector ê°ë° (ê³ ê¸)
ë ë³µì¡í ì구ì¬íì´ ìë¤ë©´ Community Connector를 ê°ë°í©ëë¤:
// Community Connector ìì (Apps Script)
function getConfig() {
return {
configParams: [
{
name: 'project_id',
displayName: 'BigQuery Project ID',
helpText: 'Your GCP Project ID',
placeholder: 'my-project-id'
},
{
name: 'dataset_id',
displayName: 'Dataset ID'
}
]
};
}
function getData(request) {
const projectId = request.configParams.project_id;
const datasetId = request.configParams.dataset_id;
// BigQueryìì ë°ì´í° ë¡ë
const bq = BigQuery.newDataset(projectId, datasetId);
// ... ë°ì´í° ì²ë¦¬ ë¡ì§
return { rows: data };
}
Community Connectorì ì¥ì :
- ì¤ì ì§ì¤ì ì²êµ¬ (ìë¹ì¤ ê³ì ì¬ì©)
- 커ì¤í ìºì± ë¡ì§
- ì¬ì ì ìë 쿼리 í í릿
- ì¬ì©ì ì¤ì íë¼ë¯¸í°í
Step 8: ë³´ì ë° ì ê·¼ ì ì´
BigQuery ìì¤ì ë³´ì
-- í¹ì ì¬ì©ììê²ë§ í
ì´ë¸ ì ê·¼ ê¶í ë¶ì¬
GRANT `roles/bigquery.dataViewer`
ON TABLE `my-project.analytics_dataset.events`
TO "user@example.com";
-- í ìì¤ ë³´ì (Row-Level Security)
CREATE OR REPLACE ROW ACCESS POLICY rls_by_country
ON `my-project.analytics_dataset.events`
GRANT ('editor@company.com') TO ('KR'),
('viewer@company.com') TO ('US', 'JP');
Looker Studio ìì¤ì ë³´ì
- ëìë³´ë ê³µì ì ë·°ì´ ê¶í ì¤ì (Viewer/Editor)
- í¹ì ì¬ì©ì/그룹ìë§ ê³µì
- ë°ì´í° ìì¤ë³ ê¶í ê´ë¦¬
Output format
ëìë³´ë ì¤ì ì²´í¬ë¦¬ì¤í¸
## Dashboard Setup Checklist
### ë°ì´í° ìì¤ ì¤ì
- [ ] BigQuery íë¡ì í¸/ë°ì´í°ì
ì¤ë¹
- [ ] IAM ê¶í ì¤ì ìë£
- [ ] ì¤ì¼ì¤ë 쿼리 êµ¬ì± (ì±ë¥ ìµì í)
- [ ] ë°ì´í° ìì¤ ì°ê²° í
ì¤í¸
### ëìë³´ë ì¤ê³
- [ ] F-í¨í´ ë ì´ìì ì ì©
- [ ] KPI íì¼ ë°°ì¹ (3-4ê°)
- [ ] 주ì ì°¨í¸ ì¶ê° (ì¶ì¸/ë¹êµ)
- [ ] ìì¸ í
ì´ë¸ í¬í¨
- [ ] ì¸í°ëí°ë¸ íí° ì¶ê°
### ì±ë¥ ìµì í
- [ ] íí°ì
í¤ íì© íì¸
- [ ] 쿼리 ë¹ì© ìµì í
- [ ] ìºì± ì ëµ ì ì©
- [ ] ì°¨í¸ ì 20-25ê° ì´í íì¸
### ê³µì ë° ë³´ì
- [ ] ì ê·¼ ê¶í ì¤ì
- [ ] ë°ì´í° ë³´ì ê²í
- [ ] ê³µì ë§í¬ ìì±
Constraints
íì ê·ì¹ (MUST)
- ë ì§ íí° íì: 모ë ëìë³´ëì ë ì§ ë²ì íí° í¬í¨
- íí°ì ì¬ì©: BigQuery 쿼리ìì íí°ì í¤ ì§ì ì¬ì©
- ê¶í ë¶ë¦¬: ë°ì´í° ìì¤ë³ ì ê·¼ ê¶í ëª íí ì¤ì
ê¸ì§ ì¬í (MUST NOT)
- ê³¼ëí ì°¨í¸: í ëìë³´ëì 25ê° ì´ê³¼ ì°¨í¸ ë°°ì¹ ê¸ì§
- **SELECT ***: ì ì²´ ì»¬ë¼ ì¡°í ëì íìí 컬ë¼ë§ ì í
- ë¼ì´ë¸ 쿼리 ë¨ì©: ëì©ë í ì´ë¸ì ì§ì ì°ê²° ì§ì
Best practices
| í목 | ê¶ì¥ì¬í |
|---|---|
| ë°ì´í° ìë¡ê³ 침 | ì¤ì¼ì¤ë 쿼리 ì¬ì©, ì¼ê°ì ì¤í |
| ëìë³´ë í¬ê¸° | ìµë 25ê° ì°¨í¸, íìì ì¬ë¬ íì´ì§ë¡ ë¶ì° |
| íí° êµ¬ì± | ë ì§ íí° íì, 3-5ê° ì¶ê° íí°ë¡ ì í |
| ìì íë í¸ | íì¬ ë¸ëë 3-4ê°ì§ ììë§ ì¬ì© |
| íì´í/ë ì´ë¸ | ëª íí ì¤ëª ì¼ë¡ ì§ê´ì± íë³´ |
| ì°¨í¸ ì í | KPI â ì¶ì¸ â ë¹êµ â ìì¸ ììë¡ ë°°ì¹ |
| ìëµ ìë | íê· 2-3ì´ ì´ë´ ë¡ë© 목í |
| ë¹ì© ê´ë¦¬ | ì BigQuery ì¤ìºë 5TB ì´ë´ |
References
- Looker Studio Help
- BigQuery Documentation
- Connect to BigQuery
- Community Connectors
- Dashboard Design Best Practices
Metadata
ë²ì
- íì¬ ë²ì : 1.0.0
- ìµì¢ ì ë°ì´í¸: 2026-01-14
- í¸í íë«í¼: Claude, ChatGPT, Gemini
ê´ë ¨ ì¤í¬
- monitoring-observability: ë°ì´í° ìì§ ë° ëª¨ëí°ë§
- database-schema-design: ë°ì´í° 모ë¸ë§
íê·¸
#Looker-Studio #BigQuery #dashboard #analytics #visualization #GCP
Examples
Example 1: 기본 ëìë³´ë ìì±
-- 1. ì¼ì¼ ìì½ í
ì´ë¸ ìì±
CREATE OR REPLACE TABLE `my-project.looker_data.daily_metrics` AS
SELECT
event_date,
COUNT(DISTINCT user_id) as dau,
SUM(revenue) as total_revenue,
COUNT(*) as total_events
FROM `my-project.analytics.events`
WHERE event_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
GROUP BY event_date;
-- 2. Looker Studioìì ì´ í
ì´ë¸ì ì°ê²°
-- 3. KPI ì¤ì½ì´ì¹´ë ì¶ê°: DAU, ì´ ë§¤ì¶
-- 4. ë¼ì¸ ì°¨í¸ë¡ ì¼ì¼ ì¶ì¸ ìê°í
Example 2: ê³ ê¸ ë¶ì ëìë³´ë
-- ì½í¸í¸ ë¶ìì ìí ë°ì´í° ì¤ë¹
CREATE OR REPLACE TABLE `my-project.looker_data.cohort_analysis` AS
WITH user_cohort AS (
SELECT
user_id,
DATE_TRUNC(MIN(event_date), WEEK) as cohort_week
FROM `my-project.analytics.events`
GROUP BY user_id
)
SELECT
uc.cohort_week,
DATE_DIFF(e.event_date, uc.cohort_week, WEEK) as week_number,
COUNT(DISTINCT e.user_id) as active_users
FROM `my-project.analytics.events` e
JOIN user_cohort uc ON e.user_id = uc.user_id
GROUP BY cohort_week, week_number
ORDER BY cohort_week, week_number;