bigquery
Comprehensive guide for using BigQuery CLI (bq) to query and inspect tables in Monzo's BigQuery projects, with emphasis on data sensitivity and INFORMATION_SCHEMA queries.
What this skill does
# BigQuery CLI Skill
This skill provides comprehensive guidance on using the BigQuery CLI (`bq`) for querying and inspecting data in Monzo's BigQuery projects.
## Core Principles
1. **Always specify the project explicitly** using `--project_id=PROJECT_NAME`
2. **Always use Standard SQL** with `--use_legacy_sql=false`
3. **Respect data sensitivity** - avoid querying actual content from sensitive tables
4. **Use INFORMATION_SCHEMA** for metadata queries (schemas, columns, tables)
## Common Query Patterns
### 1. Check Table Schema (INFORMATION_SCHEMA)
Use this to inspect column names, types, and structure **without accessing sensitive data**:
```bash
bq query --project_id=monzo-analytics --use_legacy_sql=false \
"SELECT column_name, data_type, is_nullable
FROM \`monzo-analytics.DATASET_NAME.INFORMATION_SCHEMA.COLUMNS\`
WHERE table_name = 'TABLE_NAME'
ORDER BY ordinal_position"
```
**Examples:**
```bash
# Check dims dataset table schema
bq query --project_id=monzo-analytics --use_legacy_sql=false \
"SELECT column_name, data_type FROM \`monzo-analytics.dims.INFORMATION_SCHEMA.COLUMNS\`
WHERE table_name = 'vulnerable_customer_logs_dim' ORDER BY ordinal_position"
# Check prod dataset table schema
bq query --project_id=monzo-analytics --use_legacy_sql=false \
"SELECT column_name, data_type FROM \`monzo-analytics.prod.INFORMATION_SCHEMA.COLUMNS\`
WHERE table_name = 'transactions' ORDER BY ordinal_position"
```
### 2. Count Rows (Safe for Sensitive Tables)
Use `COUNT(*)` to check table size without exposing data:
```bash
bq query --project_id=monzo-analytics --use_legacy_sql=false \
"SELECT COUNT(*) as row_count FROM \`monzo-analytics.DATASET.TABLE_NAME\`"
```
**Example:**
```bash
bq query --project_id=monzo-analytics --use_legacy_sql=false \
"SELECT COUNT(*) as row_count FROM \`monzo-analytics.dims.vulnerable_customer_logs_dim\`"
```
### 3. List All Tables in a Dataset
```bash
bq query --project_id=monzo-analytics --use_legacy_sql=false \
"SELECT table_name, table_type
FROM \`monzo-analytics.DATASET_NAME.INFORMATION_SCHEMA.TABLES\`
ORDER BY table_name"
```
**Example:**
```bash
bq query --project_id=monzo-analytics --use_legacy_sql=false \
"SELECT table_name FROM \`monzo-analytics.dims.INFORMATION_SCHEMA.TABLES\`
ORDER BY table_name"
```
### 4. Export Schema to File
Useful for programmatic processing of table schemas:
```bash
bq query --project_id=monzo-analytics --use_legacy_sql=false \
--format=csv --quiet \
"SELECT column_name FROM \`monzo-analytics.DATASET.INFORMATION_SCHEMA.COLUMNS\`
WHERE table_name = 'TABLE_NAME' ORDER BY ordinal_position" \
| tail -n +2 > /tmp/columns.txt
```
**Example:**
```bash
bq query --project_id=monzo-analytics --use_legacy_sql=false \
--format=csv --quiet \
"SELECT column_name FROM \`monzo-analytics.dims.INFORMATION_SCHEMA.COLUMNS\`
WHERE table_name = 'vulnerable_customer_logs_dim' ORDER BY ordinal_position" \
| tail -n +2 > /tmp/columns.txt
```
### 5. Check Table Metadata
Get table creation time, size, and other metadata:
```bash
bq query --project_id=monzo-analytics --use_legacy_sql=false \
"SELECT
table_name,
creation_time,
ROUND(size_bytes/1024/1024/1024, 2) as size_gb,
row_count
FROM \`monzo-analytics.DATASET_NAME.INFORMATION_SCHEMA.TABLES\`
WHERE table_name = 'TABLE_NAME'"
```
### 6. Find Tables by Pattern
Search for tables matching a naming pattern:
```bash
bq query --project_id=monzo-analytics --use_legacy_sql=false \
"SELECT table_name
FROM \`monzo-analytics.DATASET_NAME.INFORMATION_SCHEMA.TABLES\`
WHERE table_name LIKE '%PATTERN%'
ORDER BY table_name"
```
**Example:**
```bash
# Find all customer-related tables
bq query --project_id=monzo-analytics --use_legacy_sql=false \
"SELECT table_name FROM \`monzo-analytics.dims.INFORMATION_SCHEMA.TABLES\`
WHERE table_name LIKE '%customer%' ORDER BY table_name"
```
### 7. Get Detailed Column Information
Get comprehensive column metadata including descriptions:
```bash
bq query --project_id=monzo-analytics --use_legacy_sql=false \
"SELECT
column_name,
data_type,
is_nullable,
is_partitioning_column
FROM \`monzo-analytics.DATASET.INFORMATION_SCHEMA.COLUMNS\`
WHERE table_name = 'TABLE_NAME'
ORDER BY ordinal_position"
```
### 8. Sample Data (Non-Sensitive Tables Only)
**⚠️ WARNING:** Only use this on non-sensitive tables. Never query actual content from people/staff/PII tables.
```bash
bq query --project_id=monzo-analytics --use_legacy_sql=false \
"SELECT * FROM \`monzo-analytics.DATASET.TABLE_NAME\` LIMIT 10"
```
## Output Formatting Options
Control how results are displayed:
```bash
# CSV format
--format=csv
# JSON format
--format=json
# Pretty table format (default)
--format=prettyjson
# Quiet mode (no status messages)
--quiet
# Maximum rows to return
--max_rows=100
```
## Common Projects and Datasets
### Main Analytics Projects
- `monzo-analytics` - Main analytics warehouse
- `monzo-analytics-v2` - New OOM architecture models
- `monzo-analytics-pii` - PII-containing data (use with caution)
- `sanitized-events-prod` - Sanitised event data
- `raw-analytics-events-prod` - Raw event data
### Common Datasets
- `dims` - Dimension tables
- `prod` - Production tables
- `lending` - Lending-specific tables
- `slurpee` - Slurpee data
## Data Sensitivity Guidelines
### ✅ SAFE Operations (Always Allowed)
1. **INFORMATION_SCHEMA queries** - These only return metadata, not actual data
2. **COUNT(*) queries** - These only return row counts
3. **Schema inspection** - Column names, types, table structure
### ⚠️ RESTRICTED Operations (Use with Caution)
1. **Querying actual content** from:
- People/staff data tables
- PII-containing tables
- Customer financial data
- Authentication/security tables
2. **When in doubt:**
- Stick to INFORMATION_SCHEMA queries
- Use COUNT(*) to verify table exists
- Ask the user before querying actual content
### 🚫 NEVER Do This
- Query actual rows from `people`, `staff`, `hibob` tables
- Export PII data to local files
- Query authentication credentials or tokens
- Access customer financial details without explicit permission
## Error Handling
### Common Errors and Solutions
**Error: "Not found: Table"**
```bash
# Solution: Check the table exists first
bq query --project_id=monzo-analytics --use_legacy_sql=false \
"SELECT table_name FROM \`monzo-analytics.DATASET.INFORMATION_SCHEMA.TABLES\`
WHERE table_name LIKE '%SEARCH_TERM%'"
```
**Error: "Access Denied"**
```bash
# Solution: You may not have permissions for that project/dataset
# Try a different project or ask the user about access
```
**Error: "Syntax error"**
```bash
# Solution: Ensure you're using Standard SQL (--use_legacy_sql=false)
# Check backtick usage around project.dataset.table identifiers
```
## Best Practices
1. **Always use fully-qualified table names** with backticks:
```sql
`project-id.dataset.table`
```
2. **Use LIMIT for exploratory queries** to avoid large result sets:
```sql
SELECT * FROM `project.dataset.table` LIMIT 10
```
3. **Check row counts before running expensive queries**:
```bash
# First check size
bq query --project_id=monzo-analytics --use_legacy_sql=false \
"SELECT COUNT(*) FROM \`project.dataset.table\`"
# Then run full query if reasonable
```
4. **Use dry-run for cost estimation** (for expensive queries):
```bash
bq query --dry_run --use_legacy_sql=false "YOUR_QUERY_HERE"
```
5. **Export large results to file**:
```bash
bq query --project_id=monzo-analytics --use_legacy_sql=false \
--format=csv "YOUR_QUERY" > output.csv
```
## Quick Reference Commands
```bash
# Schema check
bq query --project_id=PROJECT --use_legacy_sql=false \
"SELECT column_name, data_type FROM \`PROJECT.DATASET.INFORMATION_SCHEMA.COLUMNS\`
WHERE table_name = 'TABLE' ORDER BY ordinal_position"
# Row count
bq query --project_Related in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.