複数のアプリやMCPホストからブランド画像・動画を生成、調整、書き出し、挿入する作業を支援します。ライブラリ選択や修正依頼も扱います。
- スライド用のブランド画像を作りたいとき
- 既存素材をフィードバックに合わせて直したいとき
- 動画素材を生成して書き出したいとき
dbtのモデル構成やBigQuery向けSQLの書き方、列名・型・結合の注意点を参照し、分析用テーブルやクエリを作成・検証するスキルです。
dbt (data build tool) project structure, SQL patterns, and best practices for the analytics warehouse. Use this skill when working with dbt models, testing SQL queries, or creating new analytical tables.
実行スコア 未検証
インストール方法を見る分析用データウェアハウスでdbtモデルやSQLを作る際の構成と注意点をまとめています。staging、intermediate、mart、analyticsの各層の役割や、テーブル・ビュー・incrementalなどのモデル設定を確認できます。BigQueryでよく起きる列名の食い違い、文字列から数値や真偽値への型変換、重複除外に使うQUALIFY、NULLを含む結合、ARRAY_AGGの構文上の注意も扱います。モデル作成前にクエリをテストする手順や、HubSpotの商談・コンタクト・フォーム、訪問者・サインアップ・契約などの代表的な結合例、処理量を抑えるための絞り込み方も参照できます。
新しい分析テーブルを追加する人、dbtモデルのSQLを検証したい人に向いています。既存モデルの列や結合キーを調べるとき、集計結果の重複や型不一致、クエリの処理量が気になる場合にも役立ちます。
資料ではdbt/への書き込みが制限されており、SQLをcode/.builder/dbt-models/で作成・検証した後、配置は利用者が手動で行う手順です。SQLの検証にはcode/scripts/のスクリプトとBigQueryの実行環境を使います。
この紹介文は、公開されている SKILL.md をもとに AI(OpenAI Codex)が作成しました。正確な仕様は下の原文を確認してください。
インストールする前に、エージェントに与えられる指示の中身を確認できます。
dbt/ (in workspace root, NOT in code/)dbt/models/ organized by layer (staging, intermediate, mart, analytics)dbt/dbt_project.ymldbt/profiles.yml⚠️ CRITICAL: The dbt directory has restricted write access. When creating or modifying dbt models:
code/.builder/dbt-models/ firstcode/scripts/dbt/models/ directory| Schema | Purpose | Examples |
|---|---|---|
dbt_staging_bigquery | Raw staged events from BigQuery | first_pageviews, all_pageviews, signups |
dbt_staging | Raw staged data from other sources | hubspot_companies, hubspot_contacts |
dbt_intermediate | Joins, transforms, denormalization | hubspot_form_submissions, deal_first_contact |
dbt_mapping | Join tables, ID mappings | hs_deals_to_contact_id, user_id_to_org_id |
dbt_mart | Dimensional models (fact/dim tables) | dim_hs_deals, dim_hs_contacts, dim_subscriptions |
dbt_analytics | Reporting views, aggregates | deals_by_motion, revenue_funnel, active_users |
dbt_dev | Development/testing (EXCLUDE from queries) | Auto-filtered by BigQuery lib |
{{
config(
schema="dbt_analytics", -- Target schema
materialized="table", -- or "view", "incremental"
tags=["daily", "analytics", "hubspot"], -- For orchestration/docs
)
}}
table - Full refresh daily, good for < 10M rowsview - No storage, always fresh, good for simple transformsincremental - Append-only, for large event tables⚠️ Common bug source: Column names differ between spec and actual tables
| Spec Column | Actual Column | Table |
|---|---|---|
first_pageview_date | created_date (TIMESTAMP) | first_pageviews |
channel | first_touch_channel | all_pageviews |
referrer | c_referrer | all_pageviews |
user_create_date | user_create_d | product_signups |
deal_stage | stage_name | dim_hs_deals |
deal_amount | amount | dim_hs_deals |
Always verify column names by querying INFORMATION_SCHEMA.COLUMNS or reading the source dbt model.
❌ WRONG (DISTINCT + ORDER BY non-argument):
ARRAY_AGG(DISTINCT form_name IGNORE NULLS ORDER BY form_fill_date LIMIT 1)
✅ CORRECT (remove DISTINCT or order by same column):
-- Option 1: Remove DISTINCT (ORDER BY creates uniqueness)
ARRAY_AGG(form_name IGNORE NULLS ORDER BY form_fill_date LIMIT 1)[SAFE_OFFSET(0)]
-- Option 2: Order by the aggregated column
ARRAY_AGG(DISTINCT form_name ORDER BY form_name LIMIT 1)[SAFE_OFFSET(0)]
BigQuery dbt models store booleans as strings in some tables. Always cast:
-- dim_hs_deals.is_closed_won is STRING 'true'/'false', not BOOL
CASE WHEN CAST(is_closed_won AS STRING) = 'true' THEN 1 ELSE 0 END
-- Amounts may be STRING, cast to numeric
SUM(CAST(amount AS FLOAT64))
Always use case-insensitive email matching:
LOWER(qf.email) = LOWER(c.email)
Use QUALIFY for window function filtering (cleaner than subquery):
SELECT *
FROM table
QUALIFY ROW_NUMBER() OVER (PARTITION BY deal_id ORDER BY created_date) = 1
When joining on potentially NULL columns (like visitor IDs):
LEFT JOIN forms f
ON (
LOWER(f.email) = LOWER(c.email)
OR (f.b_visitor_id IS NOT NULL AND f.b_visitor_id = c.b_visitor_id)
)
FROM {{ ref("dim_hs_deals") }} d
LEFT JOIN {{ ref("hs_deals_to_contact_id") }} dc
ON d.deal_id = dc.deal_id
LEFT JOIN {{ ref("dim_hs_contacts") }} c
ON dc.contact_id = c.contact_id
LEFT JOIN {{ ref("hubspot_form_submissions") }} f
ON LOWER(f.email) = LOWER(c.email)
AND f.form_fill_date < d.createdate
Key points:
hs_deals_to_contact_id unnests the associatedcontactids JSON arrayQUALIFY to dedupeb_visitor_idform_fill_date < deal.createdate) for attributionFROM {{ ref("first_pageviews") }} fp
LEFT JOIN {{ ref("signups") }} s
ON fp.visitor_id = s.visitor_id
LEFT JOIN {{ ref("dim_subscriptions") }} sub
ON s.root_organization_id = sub.root_id
-- Use product_signups for user data
FROM {{ ref("dim_hs_contacts") }} c
LEFT JOIN {{ ref("product_signups") }} ps
ON LOWER(ps.email) = LOWER(c.email)
OR (ps.user_id IS NOT NULL AND ps.user_id = c.builder_user_id)
LEFT JOIN {{ ref("dim_root_organizations") }} ro
ON ps.user_id = ro.user_id -- or use appropriate join key
WHERE ps.user_create_d IS NOT NULL
Important: Use dbt_analytics.product_signups for signup data - it has the most complete user coverage. Match on both email and user_id for best results.
Always test SQL before creating dbt model:
code/scripts/test-<feature>.sqlFROM `your-project-id.dbt_mart.dim_hs_deals`
code/scripts/test-<feature>.ts:
import { runQuery } from "../server/lib/bigquery";
import { readFileSync } from "fs";
const sql = readFileSync("scripts/test-<feature>.sql", "utf-8");
const result = await runQuery(sql);
console.log(result.rows);
pnpm action test-<feature>{{ ref("table") }})code/.builder/dbt-models/<model_name>.sqlTo detect if a contact had a product signup before deal creation, use dbt_analytics.product_signups:
-- Join to product_signups (match by email OR user_id)
-- AND signup was BEFORE deal creation
LEFT JOIN {{ ref("product_signups") }} ps
ON (
LOWER(ps.email) = LOWER(c.email)
OR (ps.user_id IS NOT NULL AND ps.user_id = c.builder_user_id)
)
AND ps.user_create_d < d.createdate
Key columns in product_signups:
user_id - Builder user IDemail - User emailuser_create_d (TIMESTAMP) - Signup/user creation dateCritical: Match on both email AND user_id with OR logic for complete coverage. user_create_d is already TIMESTAMP, no conversion needed.
Do NOT use:
dbt_staging_bigquery.signups - incomplete coveragedim_hs_contacts.sign_up_time_stamp - DATE type, requires conversion and has gapsWhen attributing form submissions to deals/contacts:
Qualifying form categories (based on actual data analysis):
WHERE (
-- Sales-related forms
LOWER(form_name) LIKE '%sales%'
OR LOWER(conversion_details) LIKE '%sales%'
-- Demo forms
OR LOWER(form_name) LIKE '%demo%'
OR LOWER(conversion_details) LIKE '%demo%'
-- Specific high-intent forms
OR form_name = '[Marketing] | Component Indexing Request'
OR conversion_details = 'Unlock Ent Trial'
)
Common form names (March 2026 data):
[Marketing] Sales Demo Form | 7.20.23 - 5,803 submissions[Marketing] Sales Demo Form - Unlock Enterprise Features - 3,971 submissionsDemo Library Form - 1,866 submissions[Marketing] | Component Indexing Request - 51 submissionsAdd to dbt/models/analytics/_models.yml:
- name: deals_inbound_outbound_motion
description: >
Classifies Enterprise deals as Inbound or Outbound based on whether
any associated contact filled a qualifying form before deal creation.
columns:
- name: deal_id
description: Unique deal identifier
- name: deal_motion
description: "Inbound or Outbound classification"
- name: qualifying_form_count
description: "Number of distinct qualifying forms filled by associated contacts"
- name: first_qualifying_form_name
description: "Name of earliest qualifying form"
dim_hs_deals ~3,400 rows, hubspot_form_submissions ~20K rowsserver/lib/bigquery.tsBased on this analysis, here are additional AI instructions that would be helpful:
associatedcontactids is non-obviousまだレビューはありません。使ってみた感想をお寄せください。
ログインなしで書き込めます。使ってみた感想、質問、動かなかった環境などを気軽にどうぞ。
まだコメントはありません。最初のコメントを書いてみませんか。
複数のアプリやMCPホストからブランド画像・動画を生成、調整、書き出し、挿入する作業を支援します。ライブラリ選択や修正依頼も扱います。
特定の顧客企業について、契約と製品利用の数値を照らし合わせ、根拠や不足情報を明記した健全性レポートをまとめます。
アプリの操作をエージェントと画面の両方から呼び出せるアクションとして実装し、API連携や画面のデータ取得を一貫した形で追加するスキルです。
新機能をUI・エージェント用アクション・説明資料・画面状態の4領域でそろえ、利用者とエージェントのどちらからも一貫して使えるようにするチェックリストです。
複数のデータソースを照合して、傾向や指標、根拠をまとめた分析結果を作成します。必要に応じて、再実行できるダッシュボードとして保存できます。
Analyticsの管理画面で、機能フラグの状態確認と切り替え、ダッシュボード利用状況の調査、接続先アプリのデータベース管理を行います。