Install any skill in seconds. Free to start, no credit card required.
Get Started Free →主要データウェアハウス方言で正確かつ高性能なSQLを記述するスキル。 「SQLを書いて」「クエリを最適化して」「BigQueryで集計」等のリクエストで発動。
.claude/skills/minicoohei-sql-queries/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 347% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 555% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 459% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 428% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 345% | 0% |
Write correct, performant, readable SQL across all major data warehouse dialects.
Date/time:
sql-- Current date/time CURRENT_DATE, CURRENT_TIMESTAMP, NOW() -- Date arithmetic date_column + INTERVAL '7 days' date_column - INTERVAL '1 month' -- Truncate to period DATE_TRUNC('month', created_at) -- Extract parts EXTRACT(YEAR FROM created_at) EXTRACT(DOW FROM created_at) -- 0=Sunday -- Format TO_CHAR(created_at, 'YYYY-MM-DD')
String functions:
sql-- Concatenation first_name || ' ' || last_name CONCAT(first_name, ' ', last_name) -- Pattern matching column ILIKE '%pattern%' -- case-insensitive column ~ '^regex_pattern$' -- regex -- String manipulation LEFT(str, n), RIGHT(str, n) SPLIT_PART(str, delimiter, position) REGEXP_REPLACE(str, pattern, replacement)
Arrays and JSON:
sql-- JSON access data->>'key' -- text data->'nested'->'key' -- json data#>>'{path,to,key}' -- nested text -- Array operations ARRAY_AGG(column) ANY(array_column) array_column @> ARRAY['value']
Performance tips:
EXPLAIN ANALYZE to profile queriesEXISTS over IN for correlated subqueriesDate/time:
sql-- Current date/time CURRENT_DATE(), CURRENT_TIMESTAMP(), SYSDATE() -- Date arithmetic DATEADD(day, 7, date_column) DATEDIFF(day, start_date, end_date) -- Truncate to period DATE_TRUNC('month', created_at) -- Extract parts YEAR(created_at), MONTH(created_at), DAY(created_at) DAYOFWEEK(created_at) -- Format TO_CHAR(created_at, 'YYYY-MM-DD')
String functions:
sql-- Case-insensitive by default (depends on collation) column ILIKE '%pattern%' REGEXP_LIKE(column, 'pattern') -- Parse JSON column:key::string -- dot notation for VARIANT PARSE_JSON('{"key": "value"}') GET_PATH(variant_col, 'path.to.key') -- Flatten arrays/objects SELECT f.value FROM table, LATERAL FLATTEN(input => array_col) f
Semi-structured data:
sql-- VARIANT type access data:customer:name::STRING data:items[0]:price::NUMBER -- Flatten nested structures SELECT t.id, item.value:name::STRING as item_name, item.value:qty::NUMBER as quantity FROM my_table t, LATERAL FLATTEN(input => t.data:items) item
Performance tips:
RESULT_SCAN(LAST_QUERY_ID()) to avoid re-running expensive queriesDate/time:
sql-- Current date/time CURRENT_DATE(), CURRENT_TIMESTAMP() -- Date arithmetic DATE_ADD(date_column, INTERVAL 7 DAY) DATE_SUB(date_column, INTERVAL 1 MONTH) DATE_DIFF(end_date, start_date, DAY) TIMESTAMP_DIFF(end_ts, start_ts, HOUR) -- Truncate to period DATE_TRUNC(created_at, MONTH) TIMESTAMP_TRUNC(created_at, HOUR) -- Extract parts EXTRACT(YEAR FROM created_at) EXTRACT(DAYOFWEEK FROM created_at) -- 1=Sunday -- Format FORMAT_DATE('%Y-%m-%d', date_column) FORMAT_TIMESTAMP('%Y-%m-%d %H:%M:%S', ts_column)
String functions:
sql-- No ILIKE, use LOWER() LOWER(column) LIKE '%pattern%' REGEXP_CONTAINS(column, r'pattern') REGEXP_EXTRACT(column, r'pattern') -- String manipulation SPLIT(str, delimiter) -- returns ARRAY ARRAY_TO_STRING(array, delimiter)
Arrays and structs:
sql-- Array operations ARRAY_AGG(column) UNNEST(array_column) ARRAY_LENGTH(array_column) value IN UNNEST(array_column) -- Struct access struct_column.field_name
Performance tips:
APPROX_COUNT_DISTINCT() for large-scale cardinality estimatesSELECT * -- billing is per-byte scannedDECLARE and SET for parameterized scriptsDate/time:
sql-- Current date/time CURRENT_DATE, GETDATE(), SYSDATE -- Date arithmetic DATEADD(day, 7, date_column) DATEDIFF(day, start_date, end_date) -- Truncate to period DATE_TRUNC('month', created_at) -- Extract parts EXTRACT(YEAR FROM created_at) DATE_PART('dow', created_at)
String functions:
sql-- Case-insensitive column ILIKE '%pattern%' REGEXP_INSTR(column, 'pattern') > 0 -- String manipulation SPLIT_PART(str, delimiter, position) LISTAGG(column, ', ') WITHIN GROUP (ORDER BY column)
Performance tips:
EXPLAIN to check query planANALYZE and VACUUM regularlyDate/time:
sql-- Current date/time CURRENT_DATE(), CURRENT_TIMESTAMP() -- Date arithmetic DATE_ADD(date_column, 7) DATEDIFF(end_date, start_date) ADD_MONTHS(date_column, 1) -- Truncate to period DATE_TRUNC('MONTH', created_at) TRUNC(date_column, 'MM') -- Extract parts YEAR(created_at), MONTH(created_at) DAYOFWEEK(created_at)
Delta Lake features:
sql-- Time travel SELECT * FROM my_table TIMESTAMP AS OF '2024-01-15' SELECT * FROM my_table VERSION AS OF 42 -- Describe history DESCRIBE HISTORY my_table -- Merge (upsert) MERGE INTO target USING source ON target.id = source.id WHEN MATCHED THEN UPDATE SET * WHEN NOT MATCHED THEN INSERT *
Performance tips:
OPTIMIZE and ZORDER for query performanceCACHE TABLE for frequently accessed datasetssql-- Ranking ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC) RANK() OVER (PARTITION BY category ORDER BY revenue DESC) DENSE_RANK() OVER (ORDER BY score DESC) -- Running totals / moving averages SUM(revenue) OVER (ORDER BY date_col ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as running_total AVG(revenue) OVER (ORDER BY date_col ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) as moving_avg_7d -- Lag / Lead LAG(value, 1) OVER (PARTITION BY entity ORDER BY date_col) as prev_value LEAD(value, 1) OVER (PARTITION BY entity ORDER BY date_col) as next_value -- First / Last value FIRST_VALUE(status) OVER (PARTITION BY user_id ORDER BY created_at ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) LAST_VALUE(status) OVER (PARTITION BY user_id ORDER BY created_at ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) -- Percent of total revenue / SUM(revenue) OVER () as pct_of_total revenue / SUM(revenue) OVER (PARTITION BY category) as pct_of_category
sqlWITH -- Step 1: Define the base population base_users AS ( SELECT user_id, created_at, plan_type FROM users WHERE created_at >= DATE '2024-01-01' AND status = 'active' ), -- Step 2: Calculate user-level metrics user_metrics AS ( SELECT u.user_id, u.plan_type, COUNT(DISTINCT e.session_id) as session_count, SUM(e.revenue) as total_revenue FROM base_users u LEFT JOIN events e ON u.user_id = e.user_id GROUP BY u.user_id, u.plan_type ), -- Step 3: Aggregate to summary level summary AS ( SELECT plan_type, COUNT(*) as user_count, AVG(session_count) as avg_sessions, SUM(total_revenue) as total_revenue FROM user_metrics GROUP BY plan_type ) SELECT * FROM summary ORDER BY total_revenue DESC;
sqlWITH cohorts AS ( SELECT user_id, DATE_TRUNC('month', first_activity_date) as cohort_month FROM users ), activity AS ( SELECT user_id, DATE_TRUNC('month', activity_date) as activity_month FROM user_activity ) SELECT c.cohort_month, COUNT(DISTINCT c.user_id) as cohort_size, COUNT(DISTINCT CASE WHEN a.activity_month = c.cohort_month THEN a.user_id END) as month_0, COUNT(DISTINCT CASE WHEN a.activity_month = c.cohort_month + INTERVAL '1 month' THEN a.user_id END) as month_1, COUNT(DISTINCT CASE WHEN a.activity_month = c.cohort_month + INTERVAL '3 months' THEN a.user_id END) as month_3 FROM cohorts c LEFT JOIN activity a ON c.user_id = a.user_id GROUP BY c.cohort_month ORDER BY c.cohort_month;
sqlWITH funnel AS ( SELECT user_id, MAX(CASE WHEN event = 'page_view' THEN 1 ELSE 0 END) as step_1_view, MAX(CASE WHEN event = 'signup_start' THEN 1 ELSE 0 END) as step_2_start, MAX(CASE WHEN event = 'signup_complete' THEN 1 ELSE 0 END) as step_3_complete, MAX(CASE WHEN event = 'first_purchase' THEN 1 ELSE 0 END) as step_4_purchase FROM events WHERE event_date >= CURRENT_DATE - INTERVAL '30 days' GROUP BY user_id ) SELECT COUNT(*) as total_users, SUM(step_1_view) as viewed, SUM(step_2_start) as started_signup, SUM(step_3_complete) as completed_signup, SUM(step_4_purchase) as purchased, ROUND(100.0 * SUM(step_2_start) / NULLIF(SUM(step_1_view), 0), 1) as view_to_start_pct, ROUND(100.0 * SUM(step_3_complete) / NULLIF(SUM(step_2_start), 0), 1) as start_to_complete_pct, ROUND(100.0 * SUM(step_4_purchase) / NULLIF(SUM(step_3_complete), 0), 1) as complete_to_purchase_pct FROM funnel;
sql-- Keep the most recent record per key WITH ranked AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY entity_id ORDER BY updated_at DESC ) as rn FROM source_table ) SELECT * FROM ranked WHERE rn = 1;
When a query fails:
ILIKE not available in BigQuery, SAFE_DIVIDE only in BigQuery)CAST(col AS DATE), col::DATE)NULLIF(denominator, 0) or dialect-specific safe division| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | pass→pass | 3,273 | 3,539 | +8% | 1 | 1 | 0% | 602 | 3,944 | +555% | 0 | 0 | — |
case-02 | pass→pass | 4,107 | 3,905 | -5% | 1 | 1 | 0% | 712 | 3,983 | +459% | 0 | 0 | — |
case-03 | fail→pass | 4,620 | 3,293 | -29% | 1 | 1 | 0% | 855 | 3,823 | +347% | 0 | 0 | — |
case-04 | pass→pass | 4,570 | 4,155 | -9% | 1 | 1 | 0% | 752 | 3,974 | +428% | 0 | 0 | — |
case-05 | pass→pass | 4,971 | 4,034 | -19% | 1 | 1 | 0% | 897 | 3,996 | +345% | 0 | 0 | — |
case-06 | pass→pass | 7,334 | 6,164 | -16% | 1 | 1 | 0% | 1,262 | 4,390 | +248% | 0 | 0 | — |
case-07 | pass→pass | 6,031 | 4,715 | -22% | 1 | 1 | 0% | 1,132 | 4,200 | +271% | 0 | 0 | — |
case-08 | pass→pass | 5,721 | 4,431 | -23% | 1 | 1 | 0% | 995 | 4,032 | +305% | 0 | 0 | — |
case-09 | pass→pass | 3,291 | 2,347 | -29% | 1 | 1 | 0% | 654 | 3,719 | +469% | 0 | 0 | — |
case-10 | pass→pass | 6,275 | 5,220 | -17% | 1 | 1 | 0% | 1,265 | 4,247 | +236% | 0 | 0 | — |
case-11 | fail→fail | 4,950 | 4,102 | -17% | 1 | 1 | 0% | 810 | 3,930 | +385% | 0 | 0 | — |
case-12 | pass→pass | 9,212 | 6,420 | -30% | 1 | 1 | 0% | 1,769 | 4,505 | +155% | 0 | 0 | — |
case-13 | pass→pass | 10,417 | 9,566 | -8% | 1 | 1 | 0% | 2,225 | 5,215 | +134% | 0 | 0 | — |
case-14 | pass→pass | 13,330 | 8,015 | -40% | 1 | 1 | 0% | 2,839 | 4,760 | +68% | 0 | 0 | — |
case-15 | pass→pass | 10,801 | 8,041 | -26% | 1 | 1 | 0% | 2,076 | 4,908 | +136% | 0 | 0 | — |
case-16 | pass→pass | 9,725 | 6,297 | -35% | 1 | 1 | 0% | 1,805 | 4,376 | +142% | 0 | 0 | — |
case-17 | pass→pass | 4,743 | 5,099 | +8% | 1 | 1 | 0% | 892 | 4,246 | +376% | 0 | 0 | — |
case-18 | pass→pass | 5,509 | 5,424 | -2% | 1 | 1 | 0% | 966 | 4,219 | +337% | 0 | 0 | — |
case-19 | pass→pass | 4,348 | 3,992 | -8% | 1 | 1 | 0% | 771 | 3,953 | +413% | 0 | 0 | — |
case-20 | pass→pass | 3,802 | 3,072 | -19% | 1 | 1 | 0% | 676 | 3,835 | +467% | 0 | 0 | — |
case-21 | pass→pass | 7,853 | 7,309 | -7% | 1 | 1 | 0% | 1,444 | 4,619 | +220% | 0 | 0 | — |
case-22 | pass→pass | 8,625 | 8,120 | -6% | 1 | 1 | 0% | 1,687 | 4,784 | +184% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +5 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.