BigQuery-specific SQL patterns: UNNEST for array expansion, STRUCT, ARRAY_AGG, DATE_DIFF/DATE_ADD, backtick-quoted table references, EXCEPT/REPLACE in SELECT, approximate aggregation, partitioned and wildcard tables.
Scanned 9/3/2026
Install to Claude Code
npx -y skills add SignalPilot-Labs/SignalPilot --skill bigquery-sql --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Bigquery Sql?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/signalpilot-labs-bigquery-sql-signalpilot)More formats (shields.io, HTML) on the badges page.
---
name: bigquery-sql
description: "BigQuery-specific SQL patterns: UNNEST for array expansion, STRUCT, ARRAY_AGG, DATE_DIFF/DATE_ADD, backtick-quoted table references, EXCEPT/REPLACE in SELECT, approximate aggregation, partitioned and wildcard tables."
type: skill
---
# BigQuery SQL Skill
## 1. Table References - Always Backtick-Quote
```sql
-- Full table reference
SELECT * FROM `project.dataset.table`;
-- Can omit project if using the default project
SELECT * FROM `dataset.table`;
```
## 2. Array Expansion - Use UNNEST
```sql
-- Explode an array column to rows
SELECT id, item
FROM `project.dataset.table`,
UNNEST(array_col) AS item;
-- UNNEST with offset (position)
SELECT id, item, pos
FROM `project.dataset.table`,
UNNEST(array_col) AS item WITH OFFSET AS pos;
-- UNNEST a literal array
SELECT * FROM UNNEST([1, 2, 3]) AS num;
```
## 3. Date Functions
```sql
-- Add/subtract time
DATE_ADD(order_date, INTERVAL 7 DAY)
DATE_ADD(CURRENT_DATE(), INTERVAL -1 MONTH)
-- Difference between dates
DATE_DIFF(end_date, start_date, DAY)
DATE_DIFF(end_date, start_date, MONTH)
-- Truncate to period
DATE_TRUNC(event_date, MONTH)
TIMESTAMP_TRUNC(event_ts, HOUR)
-- Current date/time
CURRENT_DATE()
CURRENT_TIMESTAMP()
```
## 4. SELECT EXCEPT and REPLACE
```sql
-- All columns except one
SELECT * EXCEPT (col_to_remove) FROM `dataset.table`;
-- Replace a column value inline
SELECT * REPLACE (UPPER(name) AS name) FROM `dataset.table`;
```
## 5. STRUCT and ARRAY_AGG
```sql
-- Create a STRUCT
SELECT STRUCT(id, name) AS person FROM `dataset.table`;
-- Aggregate rows into an array
SELECT department, ARRAY_AGG(employee_name) AS employees
FROM `dataset.employees`
GROUP BY department;
-- Aggregate into array of structs
SELECT ARRAY_AGG(STRUCT(id, name)) AS records FROM `dataset.table`;
```
## 6. Approximate Aggregation (for large tables)
```sql
-- Approximate distinct count (faster for large tables)
APPROX_COUNT_DISTINCT(user_id)
-- Approximate quantiles
APPROX_QUANTILES(value, 100)[OFFSET(50)] -- median
```
## 7. Partitioned Tables
When querying partitioned tables, always filter on the partition column
to avoid full-table scans:
```sql
-- Partition on _PARTITIONDATE (pseudo-column)
WHERE _PARTITIONDATE >= '2024-01-01'
-- Partition on a date column
WHERE event_date BETWEEN '2024-01-01' AND '2024-12-31'
```
## 8. Wildcard Tables (date-sharded)
```sql
-- Query all date-sharded tables matching a prefix
SELECT * FROM `project.dataset.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20240101' AND '20241231';
```
## 9. String Functions
```sql
REGEXP_EXTRACT(col, r'pattern') -- extract first match
REGEXP_REPLACE(col, r'pattern', 'repl') -- replace matches
SPLIT(col, ',')[SAFE_OFFSET(0)] -- split, access by index
TRIM(col) / LTRIM(col) / RTRIM(col)
FORMAT('%s-%d', str_col, int_col) -- printf-style formatting
```
## 10. Common Anti-Patterns to Avoid
- Do NOT use `= NULL` - use `IS NULL`
- Do NOT forget to filter partitioned tables - costs money
- Do NOT use `COUNT(DISTINCT ...)` on huge tables - use `APPROX_COUNT_DISTINCT`
- Always backtick-quote table names with dots in them
## 11. Dialect Patterns
- **STRING_AGG**: Use `STRING_AGG(col, ',' ORDER BY col)` for string aggregation (not GROUP_CONCAT).
- **SAFE_DIVIDE / SAFE_CAST**: Use to avoid division-by-zero errors and cast failures.
- **IF / IIF**: BigQuery supports `IF(condition, true_val, false_val)` - often cleaner than CASE WHEN for simple conditions.
- **GENERATE_DATE_ARRAY / GENERATE_TIMESTAMP_ARRAY**: For date spine generation.
- **Numeric precision**: BigQuery's FLOAT64 can lose precision. Use NUMERIC for exact decimal arithmetic.
- **INFORMATION_SCHEMA**: `SELECT * FROM dataset.INFORMATION_SCHEMA.COLUMNS` for metadata queries - useful when schema_overview is insufficient.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!