[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M718ADAATAAJTJCXY6WQV22F":3,"skill-same:01M718ADAATAAJTJCXY6WQV22F":76},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":28,"publishedAt":49,"linkOnly":50,"markdownContent":51,"markdownBody":52,"frontMatter":53,"refName":54,"commitSha":55,"skillDirectory":56,"forksCount":57,"repositoryHtmlUrl":58,"repositoryHomepageUrl":6,"ownerHtmlUrl":59,"ownerBlogUrl":60,"ownerDescription":6,"updatedAt":61,"install":62,"resources":75},"01M718ADAATAAJTJCXY6WQV22F","sql-queries",null,"Write correct, performant SQL across all major data warehouse dialects (Snowflake, BigQuery, Databricks, PostgreSQL, etc.). Use when writing queries, optimizing slow SQL, translating between dialects, or building complex analytical queries with CTEs, window functions, or aggregations.","anthropics\u002Fknowledge-work-plugins","anthropics","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F76263028?v=4","01M697XGDPXJAVQ8391V2BCYTE","Anthropic","01M7188MPC48111TN566QNQE3X",35463,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fsql-queries\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],"sql","queries","sql queries","functions","when","window","warehouse","with","false","analytical","across","writing","postgresql","databricks","use","write","correct","data","snowflake","bigquery","2026-11-10 10:12:30",false,"---\nname: sql-queries\ndescription: Write correct, performant SQL across all major data warehouse dialects (Snowflake, BigQuery, Databricks, PostgreSQL, etc.). Use when writing queries, optimizing slow SQL, translating between dialects, or building complex analytical queries with CTEs, window functions, or aggregations.\nuser-invocable: false\n---\n\n# SQL Queries Skill\n\nWrite correct, performant, readable SQL across all major data warehouse dialects.\n\n## Dialect-Specific Reference\n\n### PostgreSQL (including Aurora, RDS, Supabase, Neon)\n\n**Date\u002Ftime:**\n```sql\n-- Current date\u002Ftime\nCURRENT_DATE, CURRENT_TIMESTAMP, NOW()\n\n-- Date arithmetic\ndate_column + INTERVAL '7 days'\ndate_column - INTERVAL '1 month'\n\n-- Truncate to period\nDATE_TRUNC('month', created_at)\n\n-- Extract parts\nEXTRACT(YEAR FROM created_at)\nEXTRACT(DOW FROM created_at)  -- 0=Sunday\n\n-- Format\nTO_CHAR(created_at, 'YYYY-MM-DD')\n```\n\n**String functions:**\n```sql\n-- Concatenation\nfirst_name || ' ' || last_name\nCONCAT(first_name, ' ', last_name)\n\n-- Pattern matching\ncolumn ILIKE '%pattern%'  -- case-insensitive\ncolumn ~ '^regex_pattern$'  -- regex\n\n-- String manipulation\nLEFT(str, n), RIGHT(str, n)\nSPLIT_PART(str, delimiter, position)\nREGEXP_REPLACE(str, pattern, replacement)\n```\n\n**Arrays and JSON:**\n```sql\n-- JSON access\ndata->>'key'  -- text\ndata->'nested'->'key'  -- json\ndata#>>'{path,to,key}'  -- nested text\n\n-- Array operations\nARRAY_AGG(column)\nANY(array_column)\narray_column @> ARRAY['value']\n```\n\n**Performance tips:**\n- Use `EXPLAIN ANALYZE` to profile queries\n- Create indexes on frequently filtered\u002Fjoined columns\n- Use `EXISTS` over `IN` for correlated subqueries\n- Partial indexes for common filter conditions\n- Use connection pooling for concurrent access\n\n---\n\n### Snowflake\n\n**Date\u002Ftime:**\n```sql\n-- Current date\u002Ftime\nCURRENT_DATE(), CURRENT_TIMESTAMP(), SYSDATE()\n\n-- Date arithmetic\nDATEADD(day, 7, date_column)\nDATEDIFF(day, start_date, end_date)\n\n-- Truncate to period\nDATE_TRUNC('month', created_at)\n\n-- Extract parts\nYEAR(created_at), MONTH(created_at), DAY(created_at)\nDAYOFWEEK(created_at)\n\n-- Format\nTO_CHAR(created_at, 'YYYY-MM-DD')\n```\n\n**String functions:**\n```sql\n-- Case-insensitive by default (depends on collation)\ncolumn ILIKE '%pattern%'\nREGEXP_LIKE(column, 'pattern')\n\n-- Parse JSON\ncolumn:key::string  -- dot notation for VARIANT\nPARSE_JSON('{\"key\": \"value\"}')\nGET_PATH(variant_col, 'path.to.key')\n\n-- Flatten arrays\u002Fobjects\nSELECT f.value FROM table, LATERAL FLATTEN(input => array_col) f\n```\n\n**Semi-structured data:**\n```sql\n-- VARIANT type access\ndata:customer:name::STRING\ndata:items[0]:price::NUMBER\n\n-- Flatten nested structures\nSELECT\n    t.id,\n    item.value:name::STRING as item_name,\n    item.value:qty::NUMBER as quantity\nFROM my_table t,\nLATERAL FLATTEN(input => t.data:items) item\n```\n\n**Performance tips:**\n- Use clustering keys on large tables (not traditional indexes)\n- Filter on clustering key columns for partition pruning\n- Set appropriate warehouse size for query complexity\n- Use `RESULT_SCAN(LAST_QUERY_ID())` to avoid re-running expensive queries\n- Use transient tables for staging\u002Ftemp data\n\n---\n\n### BigQuery (Google Cloud)\n\n**Date\u002Ftime:**\n```sql\n-- Current date\u002Ftime\nCURRENT_DATE(), CURRENT_TIMESTAMP()\n\n-- Date arithmetic\nDATE_ADD(date_column, INTERVAL 7 DAY)\nDATE_SUB(date_column, INTERVAL 1 MONTH)\nDATE_DIFF(end_date, start_date, DAY)\nTIMESTAMP_DIFF(end_ts, start_ts, HOUR)\n\n-- Truncate to period\nDATE_TRUNC(created_at, MONTH)\nTIMESTAMP_TRUNC(created_at, HOUR)\n\n-- Extract parts\nEXTRACT(YEAR FROM created_at)\nEXTRACT(DAYOFWEEK FROM created_at)  -- 1=Sunday\n\n-- Format\nFORMAT_DATE('%Y-%m-%d', date_column)\nFORMAT_TIMESTAMP('%Y-%m-%d %H:%M:%S', ts_column)\n```\n\n**String functions:**\n```sql\n-- No ILIKE, use LOWER()\nLOWER(column) LIKE '%pattern%'\nREGEXP_CONTAINS(column, r'pattern')\nREGEXP_EXTRACT(column, r'pattern')\n\n-- String manipulation\nSPLIT(str, delimiter)  -- returns ARRAY\nARRAY_TO_STRING(array, delimiter)\n```\n\n**Arrays and structs:**\n```sql\n-- Array operations\nARRAY_AGG(column)\nUNNEST(array_column)\nARRAY_LENGTH(array_column)\nvalue IN UNNEST(array_column)\n\n-- Struct access\nstruct_column.field_name\n```\n\n**Performance tips:**\n- Always filter on partition columns (usually date) to reduce bytes scanned\n- Use clustering for frequently filtered columns within partitions\n- Use `APPROX_COUNT_DISTINCT()` for large-scale cardinality estimates\n- Avoid `SELECT *` -- billing is per-byte scanned\n- Use `DECLARE` and `SET` for parameterized scripts\n- Preview query cost with dry run before executing large queries\n\n---\n\n### Redshift (Amazon)\n\n**Date\u002Ftime:**\n```sql\n-- Current date\u002Ftime\nCURRENT_DATE, GETDATE(), SYSDATE\n\n-- Date arithmetic\nDATEADD(day, 7, date_column)\nDATEDIFF(day, start_date, end_date)\n\n-- Truncate to period\nDATE_TRUNC('month', created_at)\n\n-- Extract parts\nEXTRACT(YEAR FROM created_at)\nDATE_PART('dow', created_at)\n```\n\n**String functions:**\n```sql\n-- Case-insensitive\ncolumn ILIKE '%pattern%'\nREGEXP_INSTR(column, 'pattern') > 0\n\n-- String manipulation\nSPLIT_PART(str, delimiter, position)\nLISTAGG(column, ', ') WITHIN GROUP (ORDER BY column)\n```\n\n**Performance tips:**\n- Design distribution keys for collocated joins (DISTKEY)\n- Use sort keys for frequently filtered columns (SORTKEY)\n- Use `EXPLAIN` to check query plan\n- Avoid cross-node data movement (watch for DS_BCAST and DS_DIST)\n- `ANALYZE` and `VACUUM` regularly\n- Use late-binding views for schema flexibility\n\n---\n\n### Databricks SQL\n\n**Date\u002Ftime:**\n```sql\n-- Current date\u002Ftime\nCURRENT_DATE(), CURRENT_TIMESTAMP()\n\n-- Date arithmetic\nDATE_ADD(date_column, 7)\nDATEDIFF(end_date, start_date)\nADD_MONTHS(date_column, 1)\n\n-- Truncate to period\nDATE_TRUNC('MONTH', created_at)\nTRUNC(date_column, 'MM')\n\n-- Extract parts\nYEAR(created_at), MONTH(created_at)\nDAYOFWEEK(created_at)\n```\n\n**Delta Lake features:**\n```sql\n-- Time travel\nSELECT * FROM my_table TIMESTAMP AS OF '2024-01-15'\nSELECT * FROM my_table VERSION AS OF 42\n\n-- Describe history\nDESCRIBE HISTORY my_table\n\n-- Merge (upsert)\nMERGE INTO target USING source\nON target.id = source.id\nWHEN MATCHED THEN UPDATE SET *\nWHEN NOT MATCHED THEN INSERT *\n```\n\n**Performance tips:**\n- Use Delta Lake's `OPTIMIZE` and `ZORDER` for query performance\n- Leverage Photon engine for compute-intensive queries\n- Use `CACHE TABLE` for frequently accessed datasets\n- Partition by low-cardinality date columns\n\n---\n\n## Common SQL Patterns\n\n### Window Functions\n\n```sql\n-- Ranking\nROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC)\nRANK() OVER (PARTITION BY category ORDER BY revenue DESC)\nDENSE_RANK() OVER (ORDER BY score DESC)\n\n-- Running totals \u002F moving averages\nSUM(revenue) OVER (ORDER BY date_col ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as running_total\nAVG(revenue) OVER (ORDER BY date_col ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) as moving_avg_7d\n\n-- Lag \u002F Lead\nLAG(value, 1) OVER (PARTITION BY entity ORDER BY date_col) as prev_value\nLEAD(value, 1) OVER (PARTITION BY entity ORDER BY date_col) as next_value\n\n-- First \u002F Last value\nFIRST_VALUE(status) OVER (PARTITION BY user_id ORDER BY created_at ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)\nLAST_VALUE(status) OVER (PARTITION BY user_id ORDER BY created_at ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)\n\n-- Percent of total\nrevenue \u002F SUM(revenue) OVER () as pct_of_total\nrevenue \u002F SUM(revenue) OVER (PARTITION BY category) as pct_of_category\n```\n\n### CTEs for Readability\n\n```sql\nWITH\n-- Step 1: Define the base population\nbase_users AS (\n    SELECT user_id, created_at, plan_type\n    FROM users\n    WHERE created_at >= DATE '2024-01-01'\n      AND status = 'active'\n),\n\n-- Step 2: Calculate user-level metrics\nuser_metrics AS (\n    SELECT\n        u.user_id,\n        u.plan_type,\n        COUNT(DISTINCT e.session_id) as session_count,\n        SUM(e.revenue) as total_revenue\n    FROM base_users u\n    LEFT JOIN events e ON u.user_id = e.user_id\n    GROUP BY u.user_id, u.plan_type\n),\n\n-- Step 3: Aggregate to summary level\nsummary AS (\n    SELECT\n        plan_type,\n        COUNT(*) as user_count,\n        AVG(session_count) as avg_sessions,\n        SUM(total_revenue) as total_revenue\n    FROM user_metrics\n    GROUP BY plan_type\n)\n\nSELECT * FROM summary ORDER BY total_revenue DESC;\n```\n\n### Cohort Retention\n\n```sql\nWITH cohorts AS (\n    SELECT\n        user_id,\n        DATE_TRUNC('month', first_activity_date) as cohort_month\n    FROM users\n),\nactivity AS (\n    SELECT\n        user_id,\n        DATE_TRUNC('month', activity_date) as activity_month\n    FROM user_activity\n)\nSELECT\n    c.cohort_month,\n    COUNT(DISTINCT c.user_id) as cohort_size,\n    COUNT(DISTINCT CASE\n        WHEN a.activity_month = c.cohort_month THEN a.user_id\n    END) as month_0,\n    COUNT(DISTINCT CASE\n        WHEN a.activity_month = c.cohort_month + INTERVAL '1 month' THEN a.user_id\n    END) as month_1,\n    COUNT(DISTINCT CASE\n        WHEN a.activity_month = c.cohort_month + INTERVAL '3 months' THEN a.user_id\n    END) as month_3\nFROM cohorts c\nLEFT JOIN activity a ON c.user_id = a.user_id\nGROUP BY c.cohort_month\nORDER BY c.cohort_month;\n```\n\n### Funnel Analysis\n\n```sql\nWITH funnel AS (\n    SELECT\n        user_id,\n        MAX(CASE WHEN event = 'page_view' THEN 1 ELSE 0 END) as step_1_view,\n        MAX(CASE WHEN event = 'signup_start' THEN 1 ELSE 0 END) as step_2_start,\n        MAX(CASE WHEN event = 'signup_complete' THEN 1 ELSE 0 END) as step_3_complete,\n        MAX(CASE WHEN event = 'first_purchase' THEN 1 ELSE 0 END) as step_4_purchase\n    FROM events\n    WHERE event_date >= CURRENT_DATE - INTERVAL '30 days'\n    GROUP BY user_id\n)\nSELECT\n    COUNT(*) as total_users,\n    SUM(step_1_view) as viewed,\n    SUM(step_2_start) as started_signup,\n    SUM(step_3_complete) as completed_signup,\n    SUM(step_4_purchase) as purchased,\n    ROUND(100.0 * SUM(step_2_start) \u002F NULLIF(SUM(step_1_view), 0), 1) as view_to_start_pct,\n    ROUND(100.0 * SUM(step_3_complete) \u002F NULLIF(SUM(step_2_start), 0), 1) as start_to_complete_pct,\n    ROUND(100.0 * SUM(step_4_purchase) \u002F NULLIF(SUM(step_3_complete), 0), 1) as complete_to_purchase_pct\nFROM funnel;\n```\n\n### Deduplication\n\n```sql\n-- Keep the most recent record per key\nWITH ranked AS (\n    SELECT\n        *,\n        ROW_NUMBER() OVER (\n            PARTITION BY entity_id\n            ORDER BY updated_at DESC\n        ) as rn\n    FROM source_table\n)\nSELECT * FROM ranked WHERE rn = 1;\n```\n\n## Error Handling and Debugging\n\nWhen a query fails:\n\n1. **Syntax errors**: Check for dialect-specific syntax (e.g., `ILIKE` not available in BigQuery, `SAFE_DIVIDE` only in BigQuery)\n2. **Column not found**: Verify column names against schema -- check for typos, case sensitivity (PostgreSQL is case-sensitive for quoted identifiers)\n3. **Type mismatches**: Cast explicitly when comparing different types (`CAST(col AS DATE)`, `col::DATE`)\n4. **Division by zero**: Use `NULLIF(denominator, 0)` or dialect-specific safe division\n5. **Ambiguous columns**: Always qualify column names with table alias in JOINs\n6. **Group by errors**: All non-aggregated columns must be in GROUP BY (except in BigQuery which allows grouping by alias)\n","# SQL Queries Skill\n\nWrite correct, performant, readable SQL across all major data warehouse dialects.\n\n## Dialect-Specific Reference\n\n### PostgreSQL (including Aurora, RDS, Supabase, Neon)\n\n**Date\u002Ftime:**\n```sql\n-- Current date\u002Ftime\nCURRENT_DATE, CURRENT_TIMESTAMP, NOW()\n\n-- Date arithmetic\ndate_column + INTERVAL '7 days'\ndate_column - INTERVAL '1 month'\n\n-- Truncate to period\nDATE_TRUNC('month', created_at)\n\n-- Extract parts\nEXTRACT(YEAR FROM created_at)\nEXTRACT(DOW FROM created_at)  -- 0=Sunday\n\n-- Format\nTO_CHAR(created_at, 'YYYY-MM-DD')\n```\n\n**String functions:**\n```sql\n-- Concatenation\nfirst_name || ' ' || last_name\nCONCAT(first_name, ' ', last_name)\n\n-- Pattern matching\ncolumn ILIKE '%pattern%'  -- case-insensitive\ncolumn ~ '^regex_pattern$'  -- regex\n\n-- String manipulation\nLEFT(str, n), RIGHT(str, n)\nSPLIT_PART(str, delimiter, position)\nREGEXP_REPLACE(str, pattern, replacement)\n```\n\n**Arrays and JSON:**\n```sql\n-- JSON access\ndata->>'key'  -- text\ndata->'nested'->'key'  -- json\ndata#>>'{path,to,key}'  -- nested text\n\n-- Array operations\nARRAY_AGG(column)\nANY(array_column)\narray_column @> ARRAY['value']\n```\n\n**Performance tips:**\n- Use `EXPLAIN ANALYZE` to profile queries\n- Create indexes on frequently filtered\u002Fjoined columns\n- Use `EXISTS` over `IN` for correlated subqueries\n- Partial indexes for common filter conditions\n- Use connection pooling for concurrent access\n\n---\n\n### Snowflake\n\n**Date\u002Ftime:**\n```sql\n-- Current date\u002Ftime\nCURRENT_DATE(), CURRENT_TIMESTAMP(), SYSDATE()\n\n-- Date arithmetic\nDATEADD(day, 7, date_column)\nDATEDIFF(day, start_date, end_date)\n\n-- Truncate to period\nDATE_TRUNC('month', created_at)\n\n-- Extract parts\nYEAR(created_at), MONTH(created_at), DAY(created_at)\nDAYOFWEEK(created_at)\n\n-- Format\nTO_CHAR(created_at, 'YYYY-MM-DD')\n```\n\n**String functions:**\n```sql\n-- Case-insensitive by default (depends on collation)\ncolumn ILIKE '%pattern%'\nREGEXP_LIKE(column, 'pattern')\n\n-- Parse JSON\ncolumn:key::string  -- dot notation for VARIANT\nPARSE_JSON('{\"key\": \"value\"}')\nGET_PATH(variant_col, 'path.to.key')\n\n-- Flatten arrays\u002Fobjects\nSELECT f.value FROM table, LATERAL FLATTEN(input => array_col) f\n```\n\n**Semi-structured data:**\n```sql\n-- VARIANT type access\ndata:customer:name::STRING\ndata:items[0]:price::NUMBER\n\n-- Flatten nested structures\nSELECT\n    t.id,\n    item.value:name::STRING as item_name,\n    item.value:qty::NUMBER as quantity\nFROM my_table t,\nLATERAL FLATTEN(input => t.data:items) item\n```\n\n**Performance tips:**\n- Use clustering keys on large tables (not traditional indexes)\n- Filter on clustering key columns for partition pruning\n- Set appropriate warehouse size for query complexity\n- Use `RESULT_SCAN(LAST_QUERY_ID())` to avoid re-running expensive queries\n- Use transient tables for staging\u002Ftemp data\n\n---\n\n### BigQuery (Google Cloud)\n\n**Date\u002Ftime:**\n```sql\n-- Current date\u002Ftime\nCURRENT_DATE(), CURRENT_TIMESTAMP()\n\n-- Date arithmetic\nDATE_ADD(date_column, INTERVAL 7 DAY)\nDATE_SUB(date_column, INTERVAL 1 MONTH)\nDATE_DIFF(end_date, start_date, DAY)\nTIMESTAMP_DIFF(end_ts, start_ts, HOUR)\n\n-- Truncate to period\nDATE_TRUNC(created_at, MONTH)\nTIMESTAMP_TRUNC(created_at, HOUR)\n\n-- Extract parts\nEXTRACT(YEAR FROM created_at)\nEXTRACT(DAYOFWEEK FROM created_at)  -- 1=Sunday\n\n-- Format\nFORMAT_DATE('%Y-%m-%d', date_column)\nFORMAT_TIMESTAMP('%Y-%m-%d %H:%M:%S', ts_column)\n```\n\n**String functions:**\n```sql\n-- No ILIKE, use LOWER()\nLOWER(column) LIKE '%pattern%'\nREGEXP_CONTAINS(column, r'pattern')\nREGEXP_EXTRACT(column, r'pattern')\n\n-- String manipulation\nSPLIT(str, delimiter)  -- returns ARRAY\nARRAY_TO_STRING(array, delimiter)\n```\n\n**Arrays and structs:**\n```sql\n-- Array operations\nARRAY_AGG(column)\nUNNEST(array_column)\nARRAY_LENGTH(array_column)\nvalue IN UNNEST(array_column)\n\n-- Struct access\nstruct_column.field_name\n```\n\n**Performance tips:**\n- Always filter on partition columns (usually date) to reduce bytes scanned\n- Use clustering for frequently filtered columns within partitions\n- Use `APPROX_COUNT_DISTINCT()` for large-scale cardinality estimates\n- Avoid `SELECT *` -- billing is per-byte scanned\n- Use `DECLARE` and `SET` for parameterized scripts\n- Preview query cost with dry run before executing large queries\n\n---\n\n### Redshift (Amazon)\n\n**Date\u002Ftime:**\n```sql\n-- Current date\u002Ftime\nCURRENT_DATE, GETDATE(), SYSDATE\n\n-- Date arithmetic\nDATEADD(day, 7, date_column)\nDATEDIFF(day, start_date, end_date)\n\n-- Truncate to period\nDATE_TRUNC('month', created_at)\n\n-- Extract parts\nEXTRACT(YEAR FROM created_at)\nDATE_PART('dow', created_at)\n```\n\n**String functions:**\n```sql\n-- Case-insensitive\ncolumn ILIKE '%pattern%'\nREGEXP_INSTR(column, 'pattern') > 0\n\n-- String manipulation\nSPLIT_PART(str, delimiter, position)\nLISTAGG(column, ', ') WITHIN GROUP (ORDER BY column)\n```\n\n**Performance tips:**\n- Design distribution keys for collocated joins (DISTKEY)\n- Use sort keys for frequently filtered columns (SORTKEY)\n- Use `EXPLAIN` to check query plan\n- Avoid cross-node data movement (watch for DS_BCAST and DS_DIST)\n- `ANALYZE` and `VACUUM` regularly\n- Use late-binding views for schema flexibility\n\n---\n\n### Databricks SQL\n\n**Date\u002Ftime:**\n```sql\n-- Current date\u002Ftime\nCURRENT_DATE(), CURRENT_TIMESTAMP()\n\n-- Date arithmetic\nDATE_ADD(date_column, 7)\nDATEDIFF(end_date, start_date)\nADD_MONTHS(date_column, 1)\n\n-- Truncate to period\nDATE_TRUNC('MONTH', created_at)\nTRUNC(date_column, 'MM')\n\n-- Extract parts\nYEAR(created_at), MONTH(created_at)\nDAYOFWEEK(created_at)\n```\n\n**Delta Lake features:**\n```sql\n-- Time travel\nSELECT * FROM my_table TIMESTAMP AS OF '2024-01-15'\nSELECT * FROM my_table VERSION AS OF 42\n\n-- Describe history\nDESCRIBE HISTORY my_table\n\n-- Merge (upsert)\nMERGE INTO target USING source\nON target.id = source.id\nWHEN MATCHED THEN UPDATE SET *\nWHEN NOT MATCHED THEN INSERT *\n```\n\n**Performance tips:**\n- Use Delta Lake's `OPTIMIZE` and `ZORDER` for query performance\n- Leverage Photon engine for compute-intensive queries\n- Use `CACHE TABLE` for frequently accessed datasets\n- Partition by low-cardinality date columns\n\n---\n\n## Common SQL Patterns\n\n### Window Functions\n\n```sql\n-- Ranking\nROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC)\nRANK() OVER (PARTITION BY category ORDER BY revenue DESC)\nDENSE_RANK() OVER (ORDER BY score DESC)\n\n-- Running totals \u002F moving averages\nSUM(revenue) OVER (ORDER BY date_col ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as running_total\nAVG(revenue) OVER (ORDER BY date_col ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) as moving_avg_7d\n\n-- Lag \u002F Lead\nLAG(value, 1) OVER (PARTITION BY entity ORDER BY date_col) as prev_value\nLEAD(value, 1) OVER (PARTITION BY entity ORDER BY date_col) as next_value\n\n-- First \u002F Last value\nFIRST_VALUE(status) OVER (PARTITION BY user_id ORDER BY created_at ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)\nLAST_VALUE(status) OVER (PARTITION BY user_id ORDER BY created_at ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)\n\n-- Percent of total\nrevenue \u002F SUM(revenue) OVER () as pct_of_total\nrevenue \u002F SUM(revenue) OVER (PARTITION BY category) as pct_of_category\n```\n\n### CTEs for Readability\n\n```sql\nWITH\n-- Step 1: Define the base population\nbase_users AS (\n    SELECT user_id, created_at, plan_type\n    FROM users\n    WHERE created_at >= DATE '2024-01-01'\n      AND status = 'active'\n),\n\n-- Step 2: Calculate user-level metrics\nuser_metrics AS (\n    SELECT\n        u.user_id,\n        u.plan_type,\n        COUNT(DISTINCT e.session_id) as session_count,\n        SUM(e.revenue) as total_revenue\n    FROM base_users u\n    LEFT JOIN events e ON u.user_id = e.user_id\n    GROUP BY u.user_id, u.plan_type\n),\n\n-- Step 3: Aggregate to summary level\nsummary AS (\n    SELECT\n        plan_type,\n        COUNT(*) as user_count,\n        AVG(session_count) as avg_sessions,\n        SUM(total_revenue) as total_revenue\n    FROM user_metrics\n    GROUP BY plan_type\n)\n\nSELECT * FROM summary ORDER BY total_revenue DESC;\n```\n\n### Cohort Retention\n\n```sql\nWITH cohorts AS (\n    SELECT\n        user_id,\n        DATE_TRUNC('month', first_activity_date) as cohort_month\n    FROM users\n),\nactivity AS (\n    SELECT\n        user_id,\n        DATE_TRUNC('month', activity_date) as activity_month\n    FROM user_activity\n)\nSELECT\n    c.cohort_month,\n    COUNT(DISTINCT c.user_id) as cohort_size,\n    COUNT(DISTINCT CASE\n        WHEN a.activity_month = c.cohort_month THEN a.user_id\n    END) as month_0,\n    COUNT(DISTINCT CASE\n        WHEN a.activity_month = c.cohort_month + INTERVAL '1 month' THEN a.user_id\n    END) as month_1,\n    COUNT(DISTINCT CASE\n        WHEN a.activity_month = c.cohort_month + INTERVAL '3 months' THEN a.user_id\n    END) as month_3\nFROM cohorts c\nLEFT JOIN activity a ON c.user_id = a.user_id\nGROUP BY c.cohort_month\nORDER BY c.cohort_month;\n```\n\n### Funnel Analysis\n\n```sql\nWITH funnel AS (\n    SELECT\n        user_id,\n        MAX(CASE WHEN event = 'page_view' THEN 1 ELSE 0 END) as step_1_view,\n        MAX(CASE WHEN event = 'signup_start' THEN 1 ELSE 0 END) as step_2_start,\n        MAX(CASE WHEN event = 'signup_complete' THEN 1 ELSE 0 END) as step_3_complete,\n        MAX(CASE WHEN event = 'first_purchase' THEN 1 ELSE 0 END) as step_4_purchase\n    FROM events\n    WHERE event_date >= CURRENT_DATE - INTERVAL '30 days'\n    GROUP BY user_id\n)\nSELECT\n    COUNT(*) as total_users,\n    SUM(step_1_view) as viewed,\n    SUM(step_2_start) as started_signup,\n    SUM(step_3_complete) as completed_signup,\n    SUM(step_4_purchase) as purchased,\n    ROUND(100.0 * SUM(step_2_start) \u002F NULLIF(SUM(step_1_view), 0), 1) as view_to_start_pct,\n    ROUND(100.0 * SUM(step_3_complete) \u002F NULLIF(SUM(step_2_start), 0), 1) as start_to_complete_pct,\n    ROUND(100.0 * SUM(step_4_purchase) \u002F NULLIF(SUM(step_3_complete), 0), 1) as complete_to_purchase_pct\nFROM funnel;\n```\n\n### Deduplication\n\n```sql\n-- Keep the most recent record per key\nWITH ranked AS (\n    SELECT\n        *,\n        ROW_NUMBER() OVER (\n            PARTITION BY entity_id\n            ORDER BY updated_at DESC\n        ) as rn\n    FROM source_table\n)\nSELECT * FROM ranked WHERE rn = 1;\n```\n\n## Error Handling and Debugging\n\nWhen a query fails:\n\n1. **Syntax errors**: Check for dialect-specific syntax (e.g., `ILIKE` not available in BigQuery, `SAFE_DIVIDE` only in BigQuery)\n2. **Column not found**: Verify column names against schema -- check for typos, case sensitivity (PostgreSQL is case-sensitive for quoted identifiers)\n3. **Type mismatches**: Cast explicitly when comparing different types (`CAST(col AS DATE)`, `col::DATE`)\n4. **Division by zero**: Use `NULLIF(denominator, 0)` or dialect-specific safe division\n5. **Ambiguous columns**: Always qualify column names with table alias in JOINs\n6. **Group by errors**: All non-aggregated columns must be in GROUP BY (except in BigQuery which allows grouping by alias)\n",{"name":5,"description":7,"user-invocable":50},"main","e605d8ddbfb688da57dfaaceebd93f12a64ef1d3","data\u002Fskills\u002Fsql-queries",3926,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins","https:\u002F\u002Fgithub.com\u002Fanthropics","https:\u002F\u002Fanthropic.com","2026-11-11 15:25:16",{"source":8,"skillName":5,"commands":63,"prompt":73,"zipAvailable":74},[64,67,70],{"tool":65,"command":66},"npx","npx skills add anthropics\u002Fknowledge-work-plugins --skill sql-queries",{"tool":68,"command":69},"bunx","bunx skills add anthropics\u002Fknowledge-work-plugins --skill sql-queries",{"tool":71,"command":72},"pnpm","pnpm dlx skills add anthropics\u002Fknowledge-work-plugins --skill sql-queries","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fsql-queries\u002FSKILL.md",true,[],[77,101,126,149,176,201],{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":49},"01M718Y97HCGW12Q53PSJDY03W","ticket-deflector","Reads a forwarded customer email or ticket, pulls order and refund status from a payments connector (PayPal, Square, or Stripe) or Shopify, account history from the CRM, and open tickets from a support desk (Zoho Desk), drafts a tone-matched reply in the owner's writing voice, and can issue a refund through the payments connector with explicit owner approval. With Shopify connected it also runs a proactive order-triage mode that surfaces orders needing attention — unfulfilled past the promised window, payment problems, pending refunds, stuck shipments — and drafts the next action for each before the customer has to ask. Use when the user says \"draft a response,\" \"answer this customer,\" \"where's my order,\" \"I want a refund,\" \"check my orders,\" or \"anything about to blow up.\"","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fsmall-business\u002Fskills\u002Fticket-deflector\u002FSKILL.md",[],[84,85,86,87,88,89,40,33,90,91,92,93,94,34,95,96,97,98,99,100],"ticket","ticket deflector","mode","up","payments","open","workflow","ask","Connector","text","mail","next","customer","support","crm","past","read",{"skillNo":102,"name":103,"nameZh":6,"description":104,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":107,"publishedAt":49},"01M718Y55HFAN5705ME5VEDZ9K","tax-season-organizer","Prepares tax-season materials for the owner's accountant, not tax advice. US federal tax; a non-US business gets its closed-books packet instead. Two modes: (1) quarterly estimated tax from YTD net income in the ledger (MYOB, NetSuite, QuickBooks, Xero, or Zoho Books); (2) year-end 1099 prep, scanning the ledger, PayPal, and Stripe for contractors paid over USD 600 into a 1099-NEC list with missing W-9 flags.\nAny tax request routes first to \u002Ftax-prep, which confirms the books are closed and reconciled before running this skill. Use this skill directly only when the owner says the period's books are already closed: \"books are closed, now do the 1099s,\" \"run the quarterly estimate off the closed numbers,\" or \"just the contractor W-9 list.\"","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fsmall-business\u002Fskills\u002Ftax-season-organizer\u002FSKILL.md",[],[108,109,110,111,112,113,114,115,116,117,33,118,119,120,121,122,100,123,124,125],"tax season organizer","tax","us federal","which","netsuite","paid","end","usd","only","now","books","xero","scanning","run","request","flags","list","stripe",{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":132,"publishedAt":49},"01M718Y13VVPHDD9NTDBVFJ2AZ","tax-prep","Prepares tax materials as a two-link chain — month-end-prep confirms the books are closed and reconciled first, then tax-season-organizer calculates the quarterly estimated payment or builds the year-end 1099-NEC list and accountant packet from those closed numbers. Requires a ledger (MYOB, NetSuite, QuickBooks, Xero, or Zoho Books); uses Gusto, PayPal, and Stripe when connected, else CSV upload. US federal tax math; a non-US business gets the closed-books packet. Prep material for a CPA, never tax advice, nothing filed. Trigger on \"quarterly taxes,\" \"estimated tax payment,\" \"how much should I set aside,\" \"1099s,\" \"1099-NEC,\" \"W-9s,\" \"year-end tax prep,\" \"get my books ready for my accountant,\" any phrasing that suggests a tax deadline is coming, or a question about net profit or YTD income that sounds like worry about a tax bill. An owner who says the period's books are already closed routes to tax-season-organizer directly.","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fsmall-business\u002Fskills\u002Ftax-prep\u002FSKILL.md",[],[133,109,134,135,110,136,137,112,138,139,140,141,142,143,144,114,145,146,147,148],"tax prep","prep","SET","as","ready","never","zoho books","get","chain","profit","for","trigger","material","question","paypal","business",{"skillNo":150,"name":151,"nameZh":6,"description":152,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":153,"categories":154,"keywords":158,"publishedAt":49},"01M718XWTWQZ01GYSG9T8RW8TW","speed-to-lead","Makes sure no inbound lead goes unanswered. Watches web forms, the shared inbox, and the CRM for new inquiries, qualifies each one against the owner's criteria, drafts a reply in the owner's voice with real meeting times for the owner to approve and send, routes anything hot to a human right away, and logs the whole thing to the CRM. Never sends on its own. Built to run on a schedule so overnight inquiries are drafted and sorted by morning, and works from forwarded or pasted inquiries when no connector is available. Use this whenever the owner is worried about inbound leads or response time — including phrasings like \"leads are going cold,\" \"did anyone answer that inquiry,\" \"I keep missing form submissions,\" \"nothing falls through the cracks,\" \"handle my inbound,\" \"respond to this lead,\" or \"we lose people because nobody gets back fast enough.\" Reach for it for a single unanswered inquiry as readily as for a standing setup.","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fsmall-business\u002Fskills\u002Fspeed-to-lead\u002FSKILL.md",[155],{"categoryNo":156,"categoryName":157,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000034","行政与办公人员",[159,160,161,162,163,164,138,165,166,167,168,169,170,171,33,172,173,92,174,175],"speed to lead","lead","speed","shared","back","cold","time","inbox","send","respond","new","web forms","people","schedule","logs","sure","human",{"skillNo":177,"name":178,"nameZh":6,"description":179,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":180,"categories":181,"keywords":185,"publishedAt":49},"01M718XQYMN1KY3TPS33967FK0","social-content-engine","Runs the owner's content operation as a standing thing rather than a one-off: keeps a rolling posting calendar, learns the owner's voice, generates on-brand Canva graphics, writes captions that sound like them, repurposes one asset into every channel format, and stages posts for approval instead of publishing on its own. Pulls product photos and prices from Shopify when connected; with no connectors, drafts the calendar and asset briefs for manual posting. Use this whenever the owner talks about posting, content, or social — including \"I need to post more,\" \"we've gone quiet on Instagram,\" \"what should we post this month,\" \"make the content,\" \"give me a month of posts,\" \"write this in my voice,\" \"repurpose this,\" or \"set up our content calendar.\" Reach for it for a single post as readily as for a full quarter. One handoff: a finished, approved campaign brief goes to canva-creator; this skill owns the standing operation.","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fsmall-business\u002Fskills\u002Fsocial-content-engine\u002FSKILL.md",[182],{"categoryNo":183,"categoryName":184,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000036","内容创作者",[186,187,188,189,190,191,135,192,193,194,195,87,196,33,197,198,199,100,44,200],"social","social content engine","engine","content engine","social content","content","brief","posts","Captions","prices","campaign","me","product","calendar","drafts",{"skillNo":202,"name":203,"nameZh":6,"description":204,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":205,"categories":206,"keywords":207,"publishedAt":49},"01M718XMPJVH0EVRVP998BVZPC","smb-router","The front door to the Small Business plugin. Listens to what the owner needs right now — vague or specific — and routes them to the best skill or slash command for the moment. Also serves as a guide: explains what's available, suggests what to try next, and adapts recommendations based on stored business context. Trigger whenever the owner asks \"what can you do,\" \"help me with my business,\" \"what should I focus on,\" \"I don't know where to start,\" or any open-ended business request that doesn't clearly match a single skill.","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fsmall-business\u002Fskills\u002Fsmb-router\u002FSKILL.md",[],[208,209,210,136,211,143,144,212,89,213,117,148,214,215,216,36,217,197,218,95],"router","smb","smb router","do","front","single","you","vague","can","plugin","focus"]