looker-studio-bigquery by akillness/oh-my-skills
npx skills add https://github.com/akillness/oh-my-skills --skill looker-studio-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="Analytics dataset",
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
);
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
IAM 权限配置
授予 IAM 权限以便 Looker Studio 可以访问 BigQuery:
| 角色 | 描述 |
|---|---|
BigQuery Data Viewer | 表读取权限 |
BigQuery User | 查询执行权限 |
BigQuery Job User | 作业执行权限 |
使用原生 BigQuery 连接器(推荐)
自定义 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
优势:
多表连接方法
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
使用计划查询代替实时查询来定期预计算数据:
-- 在 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 中配置为计划查询:
优势:
F 型布局
使用遵循用户自然阅读流程的 F 型布局:
┌─────────────────────────────────────┐
│ 页眉:Logo | 筛选器/日期选择器 │ ← 用户首先看到这里
├─────────────────────────────────────┤
│ KPI 1 │ KPI 2 │ KPI 3 │ KPI 4 │ ← 关键指标(3-4个)
├─────────────────────────────────────┤
│ │
│ 主图表(时间序列/对比) │ ← 深度洞察
│ │
├─────────────────────────────────────┤
│ 详细数据表 │ ← 详细分析
│ (启用下钻功能) │
├─────────────────────────────────────┤
│ 附加洞察 / 地图 / 热力图 │
└─────────────────────────────────────┘
仪表板组件
| 元素 | 目的 | 示例 |
|---|---|---|
| 页眉 | 仪表板标题、Logo、筛选器放置位置 | "2026 年第一季度销售分析" |
| KPI 卡片 | 一目了然地显示关键指标 | 总收入、月环比增长率、活跃用户数 |
| 趋势图 | 随时间的变化 | 显示每日/每周收入趋势的折线图 |
| 对比图 | 跨类别比较 | 按区域/产品比较销售额的条形图 |
| 分布图 | 可视化数据分布 | 热力图、散点图、气泡图 |
| 详细表格 | 提供精确数字 | 使用条件格式突出显示阈值 |
| 地图 | 地理数据 | 按国家/地区的收入分布 |
实际示例:电商仪表板
┌──────────────────────────────────────────────────┐
│ 📊 2026年1月销售分析 | 🔽 国家 | 📅 日期 │
├──────────────────────────────────────────────────┤
│ 总收入:$125,000 │ 订单数:3,200 │ 转化率:3.5% │
├──────────────────────────────────────────────────┤
│ 每日收入趋势(折线图) │
│ ↗ 上升趋势:较上月 +15% │
├──────────────────────────────────────────────────┤
│ 按类别销售额 │ 前10名产品 │
│ (条形图) │ (表格,可排序) │
├──────────────────────────────────────────────────┤
│ 按区域收入分布(地图) │
└──────────────────────────────────────────────────┘
筛选器类型
1. 日期范围筛选器(必需)
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
1. 使用分区键
-- ❌ 低效查询
SELECT * FROM events
WHERE DATE(event_timestamp) >= '2026-01-01'
-- ✅ 优化查询(使用分区)
SELECT * FROM events
WHERE event_date >= '2026-01-01' -- 直接使用分区键
2. 数据提取(提取和加载)
每晚将数据提取到 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. 缓存策略
4. 仪表板复杂度管理
为更复杂的需求开发社区连接器:
// 社区连接器示例(Apps Script)
function getConfig() {
return {
configParams: [
{
name: 'project_id',
displayName: 'BigQuery Project ID',
helpText: '您的 GCP 项目 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 };
}
社区连接器优势:
BigQuery 级别安全
-- 仅向特定用户授予表访问权限
GRANT `roles/bigquery.dataViewer`
ON TABLE `my-project.analytics_dataset.events`
TO "user@example.com";
-- 行级安全
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 级别安全
## 仪表板设置清单
### 数据源配置
- [ ] BigQuery 项目/数据集已准备
- [ ] IAM 权限已配置
- [ ] 计划查询已配置(性能优化)
- [ ] 数据源连接已测试
### 仪表板设计
- [ ] 已应用 F 型布局
- [ ] 已放置 KPI 卡片(3-4个)
- [ ] 已添加主图表(趋势/对比)
- [ ] 已包含详细表格
- [ ] 已添加交互式筛选器
### 性能优化
- [ ] 分区键使用已验证
- [ ] 查询成本已优化
- [ ] 缓存策略已应用
- [ ] 图表数量已验证(20-25个或更少)
### 共享与安全
- [ ] 访问权限已配置
- [ ] 数据安全已审查
- [ ] 共享链接已创建
| 项目 | 建议 |
|---|---|
| 数据刷新 | 使用计划查询,在夜间运行 |
| 仪表板大小 | 最多 25 个图表,如果需要可分布到多个页面 |
| 筛选器配置 | 必需日期筛选器,限制为 3-5 个附加筛选器 |
| 配色方案 | 仅使用 3-4 种公司品牌颜色 |
| 标题/标签 | 使用清晰的描述以便直观理解 |
| 图表选择 | 按顺序放置:KPI → 趋势 → 对比 → 详情 |
| 响应速度 | 目标平均加载时间在 2-3 秒内 |
| 成本管理 | 将每月 BigQuery 扫描数据量控制在 5TB 以内 |
#Looker-Studio #BigQuery #dashboard #analytics #visualization #GCP
-- 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 记分卡:日活跃用户数、总收入
-- 4. 使用折线图可视化每日趋势
-- 为队列分析准备数据
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;
每周安装次数
1
仓库
GitHub Stars
3
首次出现
1 天前
安全审计
安装于
mcpjam1
claude-code1
junie1
windsurf1
zencoder1
crush1
Project creation and activation
Create a new project in Google Cloud Console and enable the BigQuery API.
# Create project using gcloud CLI
gcloud projects create my-analytics-project
gcloud config set project my-analytics-project
gcloud services enable bigquery.googleapis.com
Create dataset and table
-- Create dataset
CREATE SCHEMA `my-project.analytics_dataset`
OPTIONS(
description="Analytics dataset",
location="US"
);
-- Create example table (GA4 data)
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 permission configuration
Grant IAM permissions so Looker Studio can access BigQuery:
| Role | Description |
|---|---|
BigQuery Data Viewer | Table read permission |
BigQuery User | Query execution permission |
BigQuery Job User | Job execution permission |
Using native BigQuery connector (recommended)
Custom SQL query approach
Write SQL directly when complex data transformation is needed:
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
Advantages:
Multiple table join approach
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
Use scheduled queries instead of live queries to periodically pre-compute data:
-- Calculate and store aggregated data daily in 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
Configure as scheduled query in BigQuery UI:
Advantages:
F-pattern layout
Use the F-pattern that follows the natural reading flow of users:
┌─────────────────────────────────────┐
│ Header: Logo | Filters/Date Picker │ ← Users see this first
├─────────────────────────────────────┤
│ KPI 1 │ KPI 2 │ KPI 3 │ KPI 4 │ ← Key metrics (3-4)
├─────────────────────────────────────┤
│ │
│ Main Chart (time series/comparison) │ ← Deep insights
│ │
├─────────────────────────────────────┤
│ Concrete data table │ ← Detailed analysis
│ (Drilldown enabled) │
├─────────────────────────────────────┤
│ Additional Insights / Map / Heatmap │
└─────────────────────────────────────┘
Dashboard components
| Element | Purpose | Example |
|---|---|---|
| Header | Dashboard title, logo, filter placement | "2026 Q1 Sales Analysis" |
| KPI tiles | Display key metrics at a glance | Total revenue, MoM growth rate, active users |
| Trend charts | Changes over time | Line chart showing daily/weekly revenue trend |
| Comparison charts | Compare across categories | Bar chart comparing sales by region/product |
| Distribution charts | Visualize data distribution | Heatmap, scatter plot, bubble chart |
| Detail tables | Provide exact figures | Conditional formatting to highlight thresholds |
| Map | Geographic data | Revenue distribution by country/region |
Real example: E-commerce dashboard
┌──────────────────────────────────────────────────┐
│ 📊 Jan 2026 Sales Analysis | 🔽 Country | 📅 Date │
├──────────────────────────────────────────────────┤
│ Total Revenue: $125,000 │ Orders: 3,200 │ Conversion: 3.5% │
├──────────────────────────────────────────────────┤
│ Daily Revenue Trend (Line Chart) │
│ ↗ Upward trend: +15% vs last month │
├──────────────────────────────────────────────────┤
│ Sales by Category │ Top 10 Products │
│ (Bar chart) │ (Table, sortable) │
├──────────────────────────────────────────────────┤
│ Revenue Distribution by Region (Map) │
└──────────────────────────────────────────────────┘
Filter types
1. Date range filter (required)
2. Dropdown filter
Example: Country selection filter
- All countries
- South Korea
- Japan
- United States
Shows only data for the selected country
3. Advanced filter (SQL-based)
-- Show only customers with revenue >= $10,000
WHERE customer_revenue >= 10000
Filter implementation example
-- 1. Date filter
event_date >= DATE_SUB(CURRENT_DATE(), INTERVAL @date_range_days DAY)
-- 2. Dropdown filter (user input)
WHERE country = @selected_country
-- 3. Composite filter
WHERE event_date >= @start_date
AND event_date <= @end_date
AND country IN (@country_list)
AND revenue >= @min_revenue
1. Using partition keys
-- ❌ Inefficient query
SELECT * FROM events
WHERE DATE(event_timestamp) >= '2026-01-01'
-- ✅ Optimized query (using partition)
SELECT * FROM events
WHERE event_date >= '2026-01-01' -- use partition key directly
2. Data extraction (Extract and Load)
Extract data to a Looker Studio-dedicated table each night:
-- Scheduled query running at midnight every day
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. Caching strategy
4. Dashboard complexity management
Develop a Community Connector for more complex requirements:
// Community Connector example (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;
// Load data from BigQuery
const bq = BigQuery.newDataset(projectId, datasetId);
// ... Data processing logic
return { rows: data };
}
Community Connector advantages:
BigQuery-level security
-- Grant table access permission to specific users only
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-level security
## Dashboard Setup Checklist
### Data Source Configuration
- [ ] BigQuery project/dataset prepared
- [ ] IAM permissions configured
- [ ] Scheduled queries configured (performance optimization)
- [ ] Data source connection tested
### Dashboard Design
- [ ] F-pattern layout applied
- [ ] KPI tiles placed (3-4)
- [ ] Main charts added (trend/comparison)
- [ ] Detail table included
- [ ] Interactive filters added
### Performance Optimization
- [ ] Partition key usage verified
- [ ] Query cost optimized
- [ ] Caching strategy applied
- [ ] Chart count verified (20-25 or fewer)
### Sharing and Security
- [ ] Access permissions configured
- [ ] Data security reviewed
- [ ] Sharing link created
| Item | Recommendation |
|---|---|
| Data refresh | Use scheduled queries, run at night |
| Dashboard size | Max 25 charts, distribute to multiple pages if needed |
| Filter configuration | Date filter required, limit to 3-5 additional filters |
| Color palette | Use only 3-4 company brand colors |
| Title/Labels | Use clear descriptions for intuitiveness |
| Chart selection | Place in order: KPI → Trend → Comparison → Detail |
| Response speed | Target average loading within 2-3 seconds |
| Cost management | Keep monthly BigQuery scanned data within 5TB |
#Looker-Studio #BigQuery #dashboard #analytics #visualization #GCP
-- 1. Create daily summary table
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. Connect to this table in Looker Studio
-- 3. Add KPI scorecards: DAU, total revenue
-- 4. Visualize daily trend with line chart
-- Prepare data for cohort analysis
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;
Weekly Installs
1
Repository
GitHub Stars
3
First Seen
1 day ago
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
mcpjam1
claude-code1
junie1
windsurf1
zencoder1
crush1
专业SEO审计工具:全面网站诊断、技术SEO优化与页面分析指南
63,800 周安装
NuGet 包管理器 - .NET 项目安全管理 NuGet 包,强制执行版本验证和恢复工作流程
8,400 周安装
如何创建AGENTS.md文件 - AI编码助手项目文档指南与模板
8,400 周安装
Azure DevOps CLI 完整指南:安装、身份验证与命令大全(2025最新版)
8,500 周安装
AI项目架构蓝图生成器:自动分析代码生成架构文档,支持.NET/Java/React等
8,400 周安装
电商配送页面生成器 - 自动创建发货信息页,优化物流展示与用户体验
205 周安装
UnoCSS 即时原子化 CSS 引擎:灵活可扩展,Tailwind CSS 超集,前端开发必备
8,700 周安装