Dolphindb sql programming
Skill dolphindb/DolphinX_Skill/dolphindb-coding-style/dolphindb-sql-programming
npx -y skills add dolphindb/DolphinX_Skill --skill dolphindb-sql-programmingAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
3 things to look at
- 29 days oldThe repository was created 29 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 7 stars7 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
为 DolphinDB / DolphinScript SQL 编写、审查和优化提供规则集。 Use when 用户需要编写、改写、审查或优化 DolphinDB SQL,包括 select/exec/update/delete、 where 条件、group by/context by/cgroup by/pivot by、aj/wj/pwj、时间窗口、数组向量、 SQL 元编程、分布式 SQL、执行计划和 SQL Trace。
SKILL.md
10.5 KB, ~3.6k tokens by cl100k_base, as published. Nobody here has run it
DolphinDB SQL 编程
使用流程
按以下流程使用本 skill:
- 判断输入是否属于 DolphinDB / DolphinScript SQL。若不是,回复“请提供 DolphinDB SQL 或 DolphinScript 表查询代码。”
- 明确任务意图:过滤与分区、时序关联与窗口、分组与组内计算、结果整形、SQL 元编程、执行语义或性能优化。
- 明确输出形态:每组一行、明细等长、累计分组、二维透视、左表等长、数组向量、动态查询结果或更新删除结果。
- 依据本文件规则选择 SQL 入口。需要案例时,阅读对应
references/scene-*.md。 - 审查代码时,按各章节的反例和检查清单确认是否需要改写。若代码已符合规则,直接说明无需改写。
总规则
规则 01:DolphinDB SQL 不是标准 SQL 的简单扩展
DolphinDB SQL 与 DolphinScript 变量、函数、向量函数、时序连接、数组向量、元编程和分布式执行机制共同工作。不要用普通 SQL 惯性替代 context by、cgroup by、pivot by、aj/wj/pwj 等 DolphinDB 专用入口。
规则 02:数据已在表中时,优先保留 SQL 承载层
过滤、投影、分组、关联、窗口、透视、更新、删除和结果整形都可在 SQL 内完成。过早取出列向量、子表或中间表,会增加扫描、合并和重新分组成本。
规则 03:SQL 可直接衔接 DolphinScript 变量和函数
SQL 可引用脚本变量、表对象、自定义函数和内置函数,也可作为变量值、函数参数和返回值。未使用 catalog 时,分布式表应通过 loadTable 等函数取得表对象后查询。
规则 04:标准 SQL 写法可用,但写入方式需判断
DolphinDB 支持 create table、insert into、select 等标准 SQL 风格,也支持 catalog 访问分布式表。分布式表大量写入时,一般优先评估 append! 或 tableInsert,不要默认使用 insert into。
规则 05:先按输出形态选择分组入口
每组一行使用 group by;明细等长输出使用 context by;累计分组输出使用 cgroup by;二维透视使用 pivot by。入口选择应由输出形态决定,而不是只看是否存在分组键。
规则 06:过滤阶段优先缩小数据范围
能用键集合过滤时,优先 exec key from dim where ... 得到键向量,再用 where key in keys 过滤主表。仅为筛选主表而做 join,通常会引入不必要的连接成本。
规则 07:where 条件需要区分普通条件和序列条件
普通条件可使用逗号或 and,并优先放置高选择性条件。条件包含 deltas、ratios、ffill、move、prev、cumsum 等序列相关函数时,应使用 and,避免逗号的逐层过滤改变序列上下文。
规则 08:分布式查询必须检查分区剪枝
分布式查询应尽量使用分区列或系统可识别的分区表达式。不要对分区列使用字符串格式化、任意算术、链式比较,或使用非分区时间列期待分区剪枝。分布式查询的 where 子句不应使用 sum、count 等聚合函数。必要时使用 sqlDS 或 [HINT_EXPLAIN] 检查扫描分区。
规则 09:时间语义先于函数选择
最近历史匹配使用 aj;左表记录匹配右表时间范围并聚合使用 wj 或 pwj;固定时间粒度聚合使用 bar;需要补齐空桶使用 interval;按时间列滑动使用 tmsum、tmavg 或 twindow。
规则 10:时间窗口单位必须匹配时间列类型
涉及 wj/pwj、interval、tm*、twindow 时,应明确时间列类型、窗口方向、窗口单位、是否补齐空桶、是否使用交易日历。DATETIME 场景中 0:4 表示秒级范围,不表示 4 分钟,应写成 0m:4m。
规则 11:组内顺序是 SQL 结果语义的一部分
使用前值、差分、累计、滑窗、limit、first、last 等逻辑时,应明确组内顺序。需要排序时使用 context by ... csort ...,不要依赖未说明的原始顺序。
规则 12:context by 的执行顺序需要单独审查
context by ... csort ... limit ... select ... order by 的顺序为:分组、组内排序、组内限制行数、执行 select、最后全局排序。存在 context by 时,limit 先于 order by;不存在 context by 时,limit 在 order by 后执行。
规则 13:累计、连续段和区间统计使用专用入口
累计分组使用 cgroup by 并显式 order by;连续相同值或连续满足条件的数据段使用 segment;按金额、价格、指标值落入有序区间统计时使用 asof(range, value);按累计成交量等阈值切分窗口时检查 volumeBar 或 accumulate;组内 TopN 后聚合优先检查 aggrTopN。
规则 14:结果整形优先使用 DolphinDB SQL 扩展
函数返回多列时使用复合字段命名;同构多档列使用 fixedLengthArrayVector;组内多行收集使用 toArray;长表转宽表和二维透视使用 pivot by;透视后按行计算使用 rowSum 等行函数。
规则 15:动态 SQL 先判断动态点
动态点可能是列名、列集合、函数名、窗口参数、过滤条件、分组字段、排序字段或批量查询模板。简单动态列名优先使用 _$name、_$$name 或字段序列;复杂表达式再使用 sql、sqlCol、makeCall、expr 等结构化元编程入口。
规则 16:结构化元编程优先于字符串拼接
运行期构造 SQL 时,优先使用 sql、sqlCol、sqlColAlias、makeCall、makeUnifiedCall、expr、unifiedExpr、binaryExpr。字符串拼接和 parseExpr 只适合边界简单且输入可信的表达式。
规则 17:动态更新、删除和解析表达式要检查上下文
动态 update/delete 使用 sqlUpdate、sqlDelete。删除条件中避免变量名与列名大小写冲突。parseExpr 不会自动查找函数体内局部变量,表达式依赖局部变量时,应通过字典传入上下文。
规则 18:分布式 SQL 优先直接查询源表
分布式表上的过滤、派生列、分组和聚合应尽量保留在同一条 SQL 中。先把分区数据合并为内存表再计算,会失去分布式并行能力并增加中间数据。
规则 19:确认分组不跨分区时可使用 map
若分区粒度大于分组粒度,并确认每个分组不会跨分区,可在 group by 后加 map,减少全局二次汇总。使用前必须确认分区方案与分组键关系。
规则 20:性能优化优先检查查询组织
多条 SQL 分步生成中间表、先连接后过滤、分组粒度过细、字符串转换过多、未命中分区列,均应优先审查。优化顺序应为减少扫描、合并查询、调整分组粒度、下推过滤,再考虑单个函数替换。
规则 21:执行计划和 Trace 用于验证查询行为
[HINT_EXPLAIN] 用于查看 SQL 执行计划,分布式查询重点观察 map、merge、扫描分区和行数。[HINT_KEEPORDER] 用于保留 context by 前的原始顺序。SQL Trace 使用 setTraceMode、getTraces、viewTraceInfo 分析复杂 SQL 内部耗时;setTraceMode(true) 必须单独执行,不能和待跟踪 SQL 放在同一段脚本中。
场景划分
场景 01:SQL 与 DolphinScript 衔接
SQL 中使用脚本变量、函数、表对象、catalog、标准 SQL 写法、动态更新删除和变量命名时,阅读 references/scene-01-SQL与DolphinScript衔接.md。
场景 02:时序关联与时间窗口 SQL
任务涉及 aj/wj/pwj、bar/interval、tm*、twindow、交易日历窗口或累计量窗口时,阅读 references/scene-02-时序关联与时间窗口SQL.md。
场景 03:分组、累计分组与组内排序
任务涉及 group by/context by/cgroup by、csort、limit、组内滑窗、连续段、区间统计或组内 TopN 聚合时,阅读 references/scene-03-分组、累计分组与组内排序.md。
场景 04:结果整形、复合字段与数组向量
任务涉及复合字段、数组向量、toArray、pivot by、字段序列、透视后行级计算时,阅读 references/scene-04-结果整形、复合字段与数组向量.md。
场景 05:SQL 元编程与动态字段
任务涉及动态 SQL、宏变量、字段序列、动态函数调用、sqlUpdate/sqlDelete、parseExpr 或批量相似查询时,阅读 references/scene-05-SQL元编程与动态字段.md。
场景 06:SQL 执行语义与性能优化
任务涉及执行顺序、where 语义、分区剪枝、where in、map、执行计划、SQL Trace 或综合优化时,阅读 references/scene-06-SQL执行语义与性能优化.md。
参考文件
-
references/SQL规则全集.md
提供完整规则来源,用于制作或修订本 skill。 -
references/SQL案例归类与规则补充.md
提供案例矩阵、反例素材和测试样本来源。 -
references/scene-*.md
提供各场景的规则、典型写法、反例、检查清单和可转测试样本。
输出要求
根据任务类型选择输出模式,保持简洁。
-
路线判断
输出至少包含:任务类型、推荐 SQL 入口、选择理由、仍需确认的前提。 -
代码改写
输出至少包含:当前写法的问题、推荐 SQL 入口、改写代码、需要注意的执行语义。 -
审查与优化
输出至少包含:主要风险、证据、推荐改写方向、是否需要执行计划或 Trace 验证。若现有代码已符合 SQL 编程规范,直接输出:代码符合 DolphinDB SQL 编程规范,无需改写。 -
信息不足
明确说明缺失信息;涉及性能判断时,说明是否需要表结构、分区方案、数据规模、排序列、执行计划或 Trace。