‹ 首页

snowflake-sql

@signalpilot-labs · 收录于 5 天前 · 上游提交 6 天前

Snowflake-specific SQL patterns: QUALIFY for window filtering, LATERAL FLATTEN for arrays, semi-structured VARIANT data, ILIKE for case-insensitive matching, date functions, and time travel.

适合你,如果经常用 Snowflake 处理 JSON 数组或时间旅行查询

/ 通过 npx 安装 校验哈希
npx oh-my-skill add signalpilot-labs/signalpilot/snowflake-sql
/ 通过 bash 安装
curl -fsSL https://oh-my-skill.com/install.sh | bash -s -- signalpilot-labs/signalpilot/snowflake-sql
/ 已经装过?验证本机副本,不用重装
npx oh-my-skill verify signalpilot-labs/signalpilot/snowflake-sql
安装目标可用 --agent / --scope 或 --to 明确指定;省略时只会在唯一已存在的 agent 目录上自动选择,零命中或多命中会停止并提示。content_hash 缺失或不一致均拒装。
473GitHub stars
~706上下文体积 · 单文件
索引托管

怎么用

商店整理自技能原文 · 版本 436a4c4 · 表述以原文为准
它做什么

当需要编写 Snowflake 特有的 SQL 查询时,Claude 会使用 QUALIFY、LATERAL FLATTEN、ILIKE、日期函数、时间旅行等 Snowflake 专属语法,并避免常见反模式。

什么时候触发

当用户询问或要求编写 Snowflake SQL 查询(如窗口过滤、半结构化数据处理、时间旅行等)时触发。

装好后可以这样说
Claude 会生成 QUALIFY 子句,无需子查询。
技能原文 SKILL.md作者撰写 · Apache-2.0 · 436a4c4

Snowflake SQL Skill

1. Window Function Filtering - Use QUALIFY

Instead of wrapping in a subquery, use QUALIFY:

-- Find the latest record per customer
SELECT customer_id, order_date, amount
FROM orders
QUALIFY ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date DESC) = 1;

-- Top 5 products by sales
SELECT product_id, total_sales
FROM sales_summary
QUALIFY DENSE_RANK() OVER (ORDER BY total_sales DESC) <= 5;
2. Case-Insensitive Matching - Use ILIKE
-- Case-insensitive LIKE
WHERE product_name ILIKE '%widget%'

-- Case-insensitive equality
WHERE UPPER(status) = 'ACTIVE'
-- or
WHERE status ILIKE 'active'
3. Arrays and Semi-Structured Data - LATERAL FLATTEN
-- Explode an ARRAY column
SELECT t.id, f.value AS item
FROM table t,
LATERAL FLATTEN(input => t.array_col) f;

-- Access VARIANT fields
SELECT col:field_name::STRING AS field_value
FROM table;

-- Parse JSON string
SELECT PARSE_JSON(json_col):key::STRING AS val
FROM table;
4. Date Functions
-- Add/subtract time
DATEADD(day, 7, order_date)          -- 7 days from order_date
DATEADD(month, -1, current_date())   -- 1 month ago

-- Difference between dates
DATEDIFF(day, start_date, end_date)  -- days between dates
DATEDIFF(month, start_date, end_date)

-- Truncate to period
DATE_TRUNC('month', event_ts)
DATE_TRUNC('year', event_ts)

-- Current timestamp
CURRENT_TIMESTAMP()
CURRENT_DATE()
5. String Functions
SPLIT_PART(col, '/', 1)              -- split by delimiter, get Nth part
REGEXP_SUBSTR(col, '[0-9]+')         -- first match of regex
TRIM(col)                            -- remove leading/trailing whitespace
LTRIM(col, '0')                      -- remove leading zeros
UPPER(col) / LOWER(col)
CONCAT(col1, '-', col2)              -- or col1 || '-' || col2
6. Null-Safe Equality
-- NULL-safe: TRUE when both are NULL or both equal
col1 IS NOT DISTINCT FROM col2

-- COALESCE for default values
COALESCE(col, 'unknown')
7. Time Travel (querying historical data)
-- Query table as it was 1 hour ago
SELECT * FROM my_table AT (OFFSET => -3600);

-- Query at a specific timestamp
SELECT * FROM my_table AT (TIMESTAMP => '2024-01-01'::TIMESTAMP);
8. Common Anti-Patterns to Avoid
  • Do NOT use = NULL - use IS NULL
  • Do NOT use <> for NULL comparison - use IS NOT NULL
  • Prefer QUALIFY over subquery wrapping for window filters
  • When accessing VARIANT fields, always cast: col:field::STRING
9. Benchmark Patterns
  • Numeric precision: Snowflake returns DECIMAL/NUMBER with configurable precision. Do NOT cast to FLOAT unless needed - precision loss fails exact-match evaluation.
  • IDENTIFIER case: Snowflake upper-cases identifiers by default. Use double-quotes "lower_case_col" when column names are lowercase in source. Always check with describe_table.
  • LISTAGG: Use LISTAGG(col, ',') WITHIN GROUP (ORDER BY col) for string aggregation (not GROUP_CONCAT).
  • TRY_CAST / TRY_TO_NUMBER: Use for safe type conversion that returns NULL instead of error.
  • OBJECT_KEYS / ARRAY_SIZE: Useful for introspecting semi-structured data before querying.
按 Apache-2.0 许可原样转载,未经改动 · 在 GitHub 查看 →

评论

登录即可评论;带「已验证安装」的,是发布者名下有本店的安装或持有记录。