‹ 首页

duckdb-sql

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

Load when hitting DuckDB syntax errors or writing DuckDB-specific SQL. Covers gotchas that differ from PostgreSQL/MySQL.

适合你,如果经常写 DuckDB SQL 并需要避免语法陷阱

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

怎么用

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

当用户遇到 DuckDB 语法错误或需要编写 DuckDB 专属 SQL 时,Claude 会使用本技能提供正确语法,并指出与 PostgreSQL/MySQL 的关键差异(如整数除法截断、日期函数不同等)。

什么时候触发

当你提的问题涉及 DuckDB 特有的 SQL 语法,或你粘贴的 DuckDB 查询报错时,本技能会被触发。

装好后可以这样说
Claude 会解释整数除法截断,并给出转浮点的修复。
Claude 会展示带 QUALIFY 子句的示例。
技能原文 SKILL.md作者撰写 · Apache-2.0 · 436a4c4

DuckDB SQL - Key Differences from PostgreSQL/MySQL

Gotchas
  • Integer division truncates: 5/2 = 2. Fix: CAST(numerator AS DOUBLE) / denominator
  • DATE_TRUNC returns TIMESTAMP: Cast result if DATE needed: CAST(DATE_TRUNC('month', col) AS DATE)
  • INTERVAL syntax: INTERVAL '1' DAY (quoted), NOT INTERVAL 1 DAY
  • No DATEADD/DATEDIFF: In standalone queries, use col + INTERVAL '1' DAY and DATE_DIFF('day', start, end) - DuckDB has no DATEADD/DATEDIFF function.
  • SUM(NULL) = NULL: Not 0. Use COALESCE(SUM(col), 0) if 0 is needed.
  • ROUND precision: If the YML specifies a decimal type like decimal(6,2), cast the FINAL output to match: CAST(ROUND(AVG(col), 2) AS DECIMAL(6,2)). Do NOT cast the input - cast the result after rounding.
  • Avoid CURRENT_DATE in models with historical data - use (SELECT MAX(date_col) FROM source) to anchor to the data's actual date range
Date Parsing
  • Non-ISO strings: STRPTIME(col, '%d/%m/%Y')::DATE
  • TRY_STRPTIME returns NULL on failure (safe)
  • Never CAST(date_str AS DATE) on non-ISO strings
QUALIFY Clause

Filter window function results without a subquery:

SELECT *, ROW_NUMBER() OVER (PARTITION BY group ORDER BY col DESC) AS rn
FROM table
QUALIFY rn <= 10
Date Spines
SELECT UNNEST(GENERATE_SERIES(min_date::DATE, max_date::DATE, INTERVAL '1' DAY)) AS date_day

Always use the primary fact table's max date as endpoint - call get_date_boundaries first.

Type Casting

CAST(x AS INTEGER), CAST(x AS DOUBLE), CAST(x AS VARCHAR), CAST(x AS DATE) TRY_CAST returns NULL on failure.

按 Apache-2.0 许可原样转载,未经改动 · 在 GitHub 查看 →

评论

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