@clickzetta/cz-cli-darwin-arm64 0.3.78 → 0.3.81

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/bin/cz-cli +0 -0
  2. package/package.json +1 -1
  3. package/bin/skills/clickzetta-access-control/LICENSE +0 -16
  4. package/bin/skills/clickzetta-access-control/SKILL.md +0 -243
  5. package/bin/skills/clickzetta-access-control/eval_cases.jsonl +0 -3
  6. package/bin/skills/clickzetta-access-control/references/dynamic-masking.md +0 -86
  7. package/bin/skills/clickzetta-access-control/references/grant-revoke.md +0 -103
  8. package/bin/skills/clickzetta-access-control/references/role-management.md +0 -66
  9. package/bin/skills/clickzetta-access-control/references/user-management.md +0 -61
  10. package/bin/skills/clickzetta-app-python-sdk/LICENSE +0 -16
  11. package/bin/skills/clickzetta-app-python-sdk/SKILL.md +0 -153
  12. package/bin/skills/clickzetta-app-python-sdk/eval_cases.jsonl +0 -12
  13. package/bin/skills/clickzetta-app-python-sdk/references/bulkload.md +0 -196
  14. package/bin/skills/clickzetta-app-python-sdk/references/connector.md +0 -143
  15. package/bin/skills/clickzetta-app-python-sdk/references/realtime.md +0 -122
  16. package/bin/skills/clickzetta-batch-sync-pipeline/LICENSE +0 -16
  17. package/bin/skills/clickzetta-batch-sync-pipeline/SKILL.md +0 -227
  18. package/bin/skills/clickzetta-batch-sync-pipeline/eval_cases.jsonl +0 -5
  19. package/bin/skills/clickzetta-bi-connect/LICENSE +0 -16
  20. package/bin/skills/clickzetta-bi-connect/SKILL.md +0 -176
  21. package/bin/skills/clickzetta-bi-connect/eval_cases.jsonl +0 -5
  22. package/bin/skills/clickzetta-bi-connect/references/bi-tools.md +0 -170
  23. package/bin/skills/clickzetta-cdc-sync-pipeline/LICENSE +0 -16
  24. package/bin/skills/clickzetta-cdc-sync-pipeline/SKILL.md +0 -633
  25. package/bin/skills/clickzetta-cdc-sync-pipeline/eval_cases.jsonl +0 -5
  26. package/bin/skills/clickzetta-data-ingest-pipeline/LICENSE +0 -16
  27. package/bin/skills/clickzetta-data-ingest-pipeline/SKILL.md +0 -237
  28. package/bin/skills/clickzetta-data-ingest-pipeline/eval_cases.jsonl +0 -5
  29. package/bin/skills/clickzetta-data-retention/LICENSE +0 -16
  30. package/bin/skills/clickzetta-data-retention/SKILL.md +0 -160
  31. package/bin/skills/clickzetta-data-retention/eval_cases.jsonl +0 -5
  32. package/bin/skills/clickzetta-data-retention/references/lifecycle-reference.md +0 -175
  33. package/bin/skills/clickzetta-data-science/LICENSE +0 -16
  34. package/bin/skills/clickzetta-data-science/SKILL.md +0 -125
  35. package/bin/skills/clickzetta-data-science/eval_cases.jsonl +0 -12
  36. package/bin/skills/clickzetta-data-science/references/bitmap-profile.md +0 -146
  37. package/bin/skills/clickzetta-data-science/references/data-patterns.md +0 -110
  38. package/bin/skills/clickzetta-data-science/references/setup.md +0 -160
  39. package/bin/skills/clickzetta-data-science/references/stats-functions.md +0 -195
  40. package/bin/skills/clickzetta-data-science/references/write-and-infer.md +0 -122
  41. package/bin/skills/clickzetta-data-science/references/zettapark-api.md +0 -156
  42. package/bin/skills/clickzetta-data-sharing/LICENSE +0 -16
  43. package/bin/skills/clickzetta-data-sharing/SKILL.md +0 -160
  44. package/bin/skills/clickzetta-data-sharing/eval_cases.jsonl +0 -3
  45. package/bin/skills/clickzetta-data-sharing/references/share-ddl.md +0 -134
  46. package/bin/skills/clickzetta-dba-guide/LICENSE +0 -16
  47. package/bin/skills/clickzetta-dba-guide/SKILL.md +0 -542
  48. package/bin/skills/clickzetta-dba-guide/eval_cases.jsonl +0 -3
  49. package/bin/skills/clickzetta-dw-modeling/LICENSE +0 -16
  50. package/bin/skills/clickzetta-dw-modeling/SKILL.md +0 -351
  51. package/bin/skills/clickzetta-dw-modeling/eval_cases.jsonl +0 -4
  52. package/bin/skills/clickzetta-dw-modeling/references/modeling-patterns.md +0 -100
  53. package/bin/skills/clickzetta-dynamic-table/LICENSE +0 -16
  54. package/bin/skills/clickzetta-dynamic-table/SKILL.md +0 -230
  55. package/bin/skills/clickzetta-dynamic-table/best-practices/dimension-table-join-guide.md +0 -253
  56. package/bin/skills/clickzetta-dynamic-table/best-practices/medallion-and-stream-patterns.md +0 -124
  57. package/bin/skills/clickzetta-dynamic-table/best-practices/non-partitioned-merge-into-warning.md +0 -96
  58. package/bin/skills/clickzetta-dynamic-table/best-practices/performance-optimization.md +0 -109
  59. package/bin/skills/clickzetta-dynamic-table/best-practices/scheduling-guide.md +0 -135
  60. package/bin/skills/clickzetta-dynamic-table/dt-creator/SKILL.md +0 -15
  61. package/bin/skills/clickzetta-dynamic-table/dt-creator/references/dt-declaration-strategy.md +0 -185
  62. package/bin/skills/clickzetta-dynamic-table/dt-creator/references/incremental-config-reference.md +0 -427
  63. package/bin/skills/clickzetta-dynamic-table/dt-creator/references/refresh-history-guide.md +0 -260
  64. package/bin/skills/clickzetta-dynamic-table/dt-creator/references/sql-limitations.md +0 -80
  65. package/bin/skills/clickzetta-dynamic-table/dynamic-table-alter/SKILL.md +0 -190
  66. package/bin/skills/clickzetta-dynamic-table/eval_cases.jsonl +0 -5
  67. package/bin/skills/clickzetta-dynamic-table/sql-to-dt/SKILL.md +0 -27
  68. package/bin/skills/clickzetta-dynamic-table/sql-to-dt/references/sql2dt-column-validation-rules.md +0 -118
  69. package/bin/skills/clickzetta-dynamic-table/sql-to-dt/references/sql2dt-conversion-rules.md +0 -225
  70. package/bin/skills/clickzetta-dynamic-table/sql-to-dt/references/sql2dt-placeholder-rules.md +0 -182
  71. package/bin/skills/clickzetta-dynamic-table/sql-to-dt/references/sql2dt-refresh-rules.md +0 -98
  72. package/bin/skills/clickzetta-dynamic-table/sql-to-dt/references/sql2dt-self-reference-rules.md +0 -76
  73. package/bin/skills/clickzetta-dynamic-table/sql-to-dt/references/sql2dt-workflow.md +0 -109
  74. package/bin/skills/clickzetta-external-catalog/LICENSE +0 -16
  75. package/bin/skills/clickzetta-external-catalog/SKILL.md +0 -123
  76. package/bin/skills/clickzetta-external-catalog/eval_cases.jsonl +0 -5
  77. package/bin/skills/clickzetta-external-catalog/references/external-catalog-ddl.md +0 -130
  78. package/bin/skills/clickzetta-external-function/LICENSE +0 -16
  79. package/bin/skills/clickzetta-external-function/SKILL.md +0 -203
  80. package/bin/skills/clickzetta-external-function/eval_cases.jsonl +0 -4
  81. package/bin/skills/clickzetta-external-function/references/external-function-ddl.md +0 -171
  82. package/bin/skills/clickzetta-file-import-pipeline/LICENSE +0 -16
  83. package/bin/skills/clickzetta-file-import-pipeline/SKILL.md +0 -190
  84. package/bin/skills/clickzetta-file-import-pipeline/eval_cases.jsonl +0 -5
  85. package/bin/skills/clickzetta-index-manager/LICENSE +0 -16
  86. package/bin/skills/clickzetta-index-manager/SKILL.md +0 -140
  87. package/bin/skills/clickzetta-index-manager/eval_cases.jsonl +0 -5
  88. package/bin/skills/clickzetta-index-manager/references/bloomfilter-index.md +0 -67
  89. package/bin/skills/clickzetta-index-manager/references/index-management.md +0 -73
  90. package/bin/skills/clickzetta-index-manager/references/inverted-index.md +0 -80
  91. package/bin/skills/clickzetta-index-manager/references/vector-index.md +0 -81
  92. package/bin/skills/clickzetta-java-sdk/LICENSE +0 -16
  93. package/bin/skills/clickzetta-java-sdk/SKILL.md +0 -186
  94. package/bin/skills/clickzetta-java-sdk/eval_cases.jsonl +0 -12
  95. package/bin/skills/clickzetta-java-sdk/references/bulkload.md +0 -163
  96. package/bin/skills/clickzetta-java-sdk/references/realtime.md +0 -212
  97. package/bin/skills/clickzetta-kafka-ingest-pipeline/LICENSE +0 -16
  98. package/bin/skills/clickzetta-kafka-ingest-pipeline/SKILL.md +0 -769
  99. package/bin/skills/clickzetta-kafka-ingest-pipeline/eval_cases.jsonl +0 -5
  100. package/bin/skills/clickzetta-kafka-ingest-pipeline/references/kafka-pipe-syntax.md +0 -324
  101. package/bin/skills/clickzetta-lakehouse-connect/LICENSE +0 -16
  102. package/bin/skills/clickzetta-lakehouse-connect/SKILL.md +0 -218
  103. package/bin/skills/clickzetta-lakehouse-connect/eval_cases.jsonl +0 -3
  104. package/bin/skills/clickzetta-lakehouse-connect/evals/evals.json +0 -35
  105. package/bin/skills/clickzetta-lakehouse-connect/references/config-file.md +0 -435
  106. package/bin/skills/clickzetta-lakehouse-connect/references/jdbc.md +0 -478
  107. package/bin/skills/clickzetta-lakehouse-connect/references/python-sdk.md +0 -225
  108. package/bin/skills/clickzetta-lakehouse-connect/references/sqlalchemy.md +0 -468
  109. package/bin/skills/clickzetta-lakehouse-connect/references/zettapark-session.md +0 -445
  110. package/bin/skills/clickzetta-manage-comments/LICENSE +0 -16
  111. package/bin/skills/clickzetta-manage-comments/SKILL.md +0 -219
  112. package/bin/skills/clickzetta-manage-comments/eval_cases.jsonl +0 -3
  113. package/bin/skills/clickzetta-metadata/LICENSE +0 -16
  114. package/bin/skills/clickzetta-metadata/SKILL.md +0 -502
  115. package/bin/skills/clickzetta-metadata/eval_cases.jsonl +0 -5
  116. package/bin/skills/clickzetta-metadata/references/instance-views-reference.md +0 -276
  117. package/bin/skills/clickzetta-metadata/references/metering-views-reference.md +0 -137
  118. package/bin/skills/clickzetta-metadata/references/show-desc-reference.md +0 -326
  119. package/bin/skills/clickzetta-metadata/references/views-reference.md +0 -271
  120. package/bin/skills/clickzetta-monitoring/LICENSE +0 -16
  121. package/bin/skills/clickzetta-monitoring/SKILL.md +0 -215
  122. package/bin/skills/clickzetta-monitoring/eval_cases.jsonl +0 -5
  123. package/bin/skills/clickzetta-monitoring/references/job-history-analysis.md +0 -97
  124. package/bin/skills/clickzetta-monitoring/references/show-jobs.md +0 -48
  125. package/bin/skills/clickzetta-oss-ingest-pipeline/LICENSE +0 -16
  126. package/bin/skills/clickzetta-oss-ingest-pipeline/SKILL.md +0 -562
  127. package/bin/skills/clickzetta-oss-ingest-pipeline/eval_cases.jsonl +0 -5
  128. package/bin/skills/clickzetta-overview/LICENSE +0 -16
  129. package/bin/skills/clickzetta-overview/SKILL.md +0 -102
  130. package/bin/skills/clickzetta-overview/eval_cases.jsonl +0 -5
  131. package/bin/skills/clickzetta-overview/references/brands-and-endpoints.md +0 -79
  132. package/bin/skills/clickzetta-overview/references/object-model.md +0 -311
  133. package/bin/skills/clickzetta-overview/references/studio-modules.md +0 -173
  134. package/bin/skills/clickzetta-pipeline-review/LICENSE +0 -16
  135. package/bin/skills/clickzetta-pipeline-review/SKILL.md +0 -377
  136. package/bin/skills/clickzetta-query-optimizer/LICENSE +0 -16
  137. package/bin/skills/clickzetta-query-optimizer/SKILL.md +0 -156
  138. package/bin/skills/clickzetta-query-optimizer/eval_cases.jsonl +0 -5
  139. package/bin/skills/clickzetta-query-optimizer/references/explain.md +0 -56
  140. package/bin/skills/clickzetta-query-optimizer/references/hints-and-sortkey.md +0 -78
  141. package/bin/skills/clickzetta-query-optimizer/references/optimize.md +0 -65
  142. package/bin/skills/clickzetta-query-optimizer/references/result-cache.md +0 -49
  143. package/bin/skills/clickzetta-query-optimizer/references/show-jobs.md +0 -42
  144. package/bin/skills/clickzetta-realtime-sync-pipeline/LICENSE +0 -16
  145. package/bin/skills/clickzetta-realtime-sync-pipeline/SKILL.md +0 -323
  146. package/bin/skills/clickzetta-realtime-sync-pipeline/eval_cases.jsonl +0 -5
  147. package/bin/skills/clickzetta-semantic-view/LICENSE +0 -16
  148. package/bin/skills/clickzetta-semantic-view/SKILL.md +0 -207
  149. package/bin/skills/clickzetta-semantic-view/eval_cases.jsonl +0 -12
  150. package/bin/skills/clickzetta-semantic-view/references/semantic-view-reference.md +0 -167
  151. package/bin/skills/clickzetta-spark-flink-connector/LICENSE +0 -16
  152. package/bin/skills/clickzetta-spark-flink-connector/SKILL.md +0 -92
  153. package/bin/skills/clickzetta-spark-flink-connector/eval_cases.jsonl +0 -5
  154. package/bin/skills/clickzetta-spark-flink-connector/references/flink.md +0 -147
  155. package/bin/skills/clickzetta-spark-flink-connector/references/spark.md +0 -132
  156. package/bin/skills/clickzetta-sql-pipeline-manager/LICENSE +0 -16
  157. package/bin/skills/clickzetta-sql-pipeline-manager/SKILL.md +0 -485
  158. package/bin/skills/clickzetta-sql-pipeline-manager/eval_cases.jsonl +0 -12
  159. package/bin/skills/clickzetta-sql-pipeline-manager/evals/evals.json +0 -166
  160. package/bin/skills/clickzetta-sql-pipeline-manager/references/dynamic-table.md +0 -185
  161. package/bin/skills/clickzetta-sql-pipeline-manager/references/materialized-view.md +0 -129
  162. package/bin/skills/clickzetta-sql-pipeline-manager/references/pipe.md +0 -222
  163. package/bin/skills/clickzetta-sql-pipeline-manager/references/table-stream.md +0 -125
  164. package/bin/skills/clickzetta-sql-syntax-guide/LICENSE +0 -16
  165. package/bin/skills/clickzetta-sql-syntax-guide/SKILL.md +0 -249
  166. package/bin/skills/clickzetta-sql-syntax-guide/eval_cases.jsonl +0 -3
  167. package/bin/skills/clickzetta-sql-syntax-guide/references/ddl-reference.md +0 -350
  168. package/bin/skills/clickzetta-sql-syntax-guide/references/dml-reference.md +0 -279
  169. package/bin/skills/clickzetta-sql-syntax-guide/references/dql-reference.md +0 -504
  170. package/bin/skills/clickzetta-sql-syntax-guide/references/functions-reference.md +0 -372
  171. package/bin/skills/clickzetta-sql-syntax-guide/references/migration-databricks.md +0 -260
  172. package/bin/skills/clickzetta-sql-syntax-guide/references/migration-snowflake.md +0 -382
  173. package/bin/skills/clickzetta-sql-syntax-guide/references/vs-snowflake.md +0 -346
  174. package/bin/skills/clickzetta-sql-syntax-guide/references/vs-spark.md +0 -229
  175. package/bin/skills/clickzetta-studio-task-manager/LICENSE +0 -16
  176. package/bin/skills/clickzetta-studio-task-manager/SKILL.md +0 -652
  177. package/bin/skills/clickzetta-table-lineage/LICENSE +0 -16
  178. package/bin/skills/clickzetta-table-lineage/SKILL.md +0 -90
  179. package/bin/skills/clickzetta-table-lineage/eval_cases.jsonl +0 -1
  180. package/bin/skills/clickzetta-table-lineage/references/normalize_func.sql +0 -14
  181. package/bin/skills/clickzetta-table-lineage/references/table_cost.sql +0 -38
  182. package/bin/skills/clickzetta-table-lineage/references/table_lineage_standalone.html +0 -562
  183. package/bin/skills/clickzetta-table-lineage/references/table_relation.sql +0 -25
  184. package/bin/skills/clickzetta-table-stream-pipeline/LICENSE +0 -16
  185. package/bin/skills/clickzetta-table-stream-pipeline/SKILL.md +0 -206
  186. package/bin/skills/clickzetta-table-stream-pipeline/eval_cases.jsonl +0 -5
  187. package/bin/skills/clickzetta-vcluster-manager/LICENSE +0 -16
  188. package/bin/skills/clickzetta-vcluster-manager/SKILL.md +0 -212
  189. package/bin/skills/clickzetta-vcluster-manager/eval_cases.jsonl +0 -5
  190. package/bin/skills/clickzetta-vcluster-manager/references/vc-cache.md +0 -54
  191. package/bin/skills/clickzetta-vcluster-manager/references/vcluster-ddl.md +0 -150
  192. package/bin/skills/clickzetta-volume-manager/LICENSE +0 -16
  193. package/bin/skills/clickzetta-volume-manager/SKILL.md +0 -292
  194. package/bin/skills/clickzetta-volume-manager/eval_cases.jsonl +0 -5
  195. package/bin/skills/clickzetta-volume-manager/references/volume-ddl.md +0 -199
  196. package/bin/skills/clickzetta-zettapark/LICENSE +0 -16
  197. package/bin/skills/clickzetta-zettapark/SKILL.md +0 -248
  198. package/bin/skills/clickzetta-zettapark/eval_cases.jsonl +0 -12
  199. package/bin/skills/clickzetta-zettapark/references/zettapark-api.md +0 -283
  200. package/bin/skills/cz-cli/SKILL.md +0 -311
  201. package/bin/skills/cz-cli/references/profile-setup.md +0 -120
@@ -1,230 +0,0 @@
1
- ---
2
- name: clickzetta-dynamic-table
3
- description: |
4
- ClickZetta Dynamic Table(动态表)使用指南与路由中心。
5
-
6
- 【触发场景】
7
- - 通用咨询:动态表介绍、使用方式、最佳实践、性能优化、增量配置
8
- - 创建指导:DT 声明策略、SQL 支持矩阵、刷新历史查询
9
- - 修改操作:检测到后自动委托给 dynamic-table-alter 子技能
10
- - SQL 转换:检测到后自动委托给 sql-to-dt 子技能
11
-
12
- 【触发关键词】
13
- "动态表怎么用"、"DT 介绍"、"动态表最佳实践"、"动态表性能优化"、
14
- "增量计算配置"、"维度表 JOIN"、"动态表刷新历史"、"静态分区 DT"、
15
- "动态分区 DT"、"状态表管理"、"非分区表风险"、"创建动态表"、
16
- "动态表调度"、"REFRESH INTERVAL"、"动态表告警"
17
-
18
- 【不触发场景】
19
- 修改操作("修改动态表"、"加列"、"改间隔"等)→ 使用 dynamic-table-alter
20
- SQL转换("转换DT"、"INSERT OVERWRITE转DT"等)→ 使用 sql-to-dt
21
- ---
22
-
23
- # Dynamic Table 使用指南 — 路由与索引
24
-
25
- 本技能是 ClickZetta 动态表的**知识中心和路由器**,根据用户意图提供参考文档或自动委托到专门的操作型子技能。
26
-
27
- ---
28
-
29
- ## 使用场景分类
30
-
31
- ### 1. 通用咨询与学习(本技能处理)
32
-
33
- **适用场景:**
34
- - 需要查询最佳实践和性能优化建议
35
- - 寻找特定配置项的说明文档
36
- - 学习如何创建动态表
37
-
38
- **触发关键词:**
39
- - "动态表怎么用"、"DT 介绍"、"Dynamic Table 是什么"
40
- - "动态表最佳实践"、"DT 性能优化"、"动态表性能调优"
41
- - "增量计算配置"、"刷新策略"、"状态表管理"
42
- - "维度表 JOIN 怎么配置"、"非分区表风险"
43
- - "动态表刷新历史怎么查"、"REFRESH HISTORY"
44
- - "静态分区 DT"、"动态分区 DT"、"DT 声明策略"
45
- - "动态表支持哪些 SQL"、"动态表 SQL 限制"
46
- - "创建动态表"、"新建动态表"、"CREATE DYNAMIC TABLE"
47
-
48
- **处理方式:** 提供相关参考文档的内容和指引。
49
-
50
- ---
51
-
52
- ### 2. 修改现有动态表(自动委托给 dynamic-table-alter 子技能)
53
-
54
- **适用场景:**
55
- - 需要修改已存在的动态表结构或属性
56
- - 暂停/恢复动态表刷新
57
- - 添加/删除列、修改刷新间隔、修改查询定义
58
-
59
- **触发关键词:**
60
- - "修改动态表"、"动态表加列"、"动态表删列"
61
- - "改刷新间隔"、"修改 REFRESH_INTERVAL"
62
- - "暂停动态表"、"恢复动态表"、"SUSPEND"、"RESUME"
63
- - "重命名列"、"修改列注释"、"修改表注释"
64
- - "ALTER DYNAMIC TABLE"、"CREATE OR REPLACE DYNAMIC TABLE"
65
- - "修改 DT 查询定义"、"修改 AS SELECT"
66
-
67
- **处理方式:**
68
- > ⚠️ 检测到修改操作意图,应立即加载 dynamic-table-alter 子技能。
69
- > 该子技能提供完整的 10 种修改操作工作流:
70
- > - 5种直接 ALTER:suspend、resume、set_comment、rename_column、set_column_comment
71
- > - 5种 CREATE OR REPLACE:add_column、drop_column、alter_column、set_refresh_interval、set_select
72
-
73
- ---
74
-
75
- ### 3. SQL 转换为动态表(自动委托给 sql-to-dt 子技能)
76
-
77
- **适用场景:**
78
- - 将 Hive/Spark 等任意批处理系统的 CREATE TABLE + INSERT OVERWRITE 转换为 DT
79
- - 批量迁移传统 ETL 到动态表
80
- - 自动生成 refresh、backfill 等配套文件
81
-
82
- **触发关键词:**
83
- - "转换 DT"、"sql to dt"、"convert to dynamic table"
84
- - "INSERT OVERWRITE 转 DT"、"DDL 转换"
85
- - "Hive SQL 转 ClickZetta"、"Spark SQL 转动态表"
86
- - "批量转换 ETL"、"迁移到动态表"
87
- - "创建动态表"、"新建动态表"、"CREATE DYNAMIC TABLE"
88
-
89
- **处理方式:**
90
- > ⚠️ 检测到 SQL 转换意图,应立即加载 sql-to-dt 子技能。
91
- > 如果用户说"创建动态表"但未提供 DDL 和 INSERT OVERWRITE,应主动提示:
92
- > "请提供原始的 CREATE TABLE DDL 和 INSERT OVERWRITE 语句,我可以全自动生成对应的 Dynamic Table DDL 及配套的 refresh、backfill 文件。"
93
- > 该子技能提供 6 步自动转换工作流:
94
- > 1. 预处理输入(移除 ALTER、ANALYZE、注释)
95
- > 2. 占位符替换(转换为 SESSION_CONFIGS)
96
- > 3. 自引用检测
97
- > 4. 核心转换(合并 DDL + INSERT 为 CREATE OR REPLACE)
98
- > 5. 列校验
99
- > 6. 生成配套文件(refresh、prev_refresh、backfill)
100
-
101
- ---
102
-
103
- ## 知识库目录
104
-
105
- ### dt-creator/ — 创建动态表参考资料
106
-
107
- **包含内容:**
108
- - **dt-declaration-strategy.md** — 静态分区 DT vs 动态分区 DT 的声明策略与选择
109
- - 静态分区 DT:使用 SESSION_CONFIGS() 传递分区参数,每个分区独立刷新
110
- - 动态分区 DT:不传递分区参数,一次性处理所有增量数据
111
- - 决策树:根据数据模式选择合适的分区策略
112
-
113
- - **sql-limitations.md** — 增量计算支持的 SQL 模式(JOIN、聚合、窗口函数等的支持情况,以及 VIEW/外部表不支持增量的限制)
114
-
115
- - **incremental-config-reference.md** — 增量刷新配置项完整参考
116
- - 刷新策略:强制全量、尝试增量并回退
117
- - 源表特征声明:维度表、仅追加表
118
- - 全量回退触发条件:基于表变更或变更量
119
- - 状态表管理:启用/禁用、生命周期、重建、schema 指定
120
- - DT 定义变更:CREATE OR REPLACE 的兼容性检查
121
- - Backfill:历史分区数据修正
122
- - 分区表写入行为:覆盖 vs 追加模式
123
-
124
- - **refresh-history-guide.md** — 刷新历史查询的 3 种方式
125
- - SHOW DYNAMIC TABLE REFRESH HISTORY:作业级信息,含 refresh_mode(INCREMENTAL/FULL/NO_DATA)
126
- - DESC HISTORY:版本级历史,含行数、字节数、操作类型
127
- - information_schema.materialized_view_refresh_history:批量分析、监控、CRU 统计
128
-
129
- **适用问题:**
130
- - "静态分区 DT 和动态分区 DT 有什么区别? "
131
- - "动态表支持哪些 SQL 语法?"
132
- - "增量计算的配置项有哪些?"
133
- - "怎么查看动态表的刷新历史?"
134
- - "什么时候会触发全量刷新?"
135
-
136
- ---
137
-
138
- ### dynamic-table-alter/ — 修改动态表操作指南
139
-
140
- **包含内容:**
141
- - 完整的动态表修改工作流(10 种操作)
142
- - 5 种直接 ALTER 操作:suspend、resume、set_comment、rename_column、set_column_comment
143
- - 5 种 CREATE OR REPLACE 操作:add_column、drop_column、alter_column、set_refresh_interval、set_select
144
- - 平台特有语法和限制说明(CHANGE COLUMN、RENAME COLUMN、DML 限制等)
145
- - 详细示例和故障排除
146
-
147
- > ⚠️ 此目录对应独立的 **dynamic-table-alter 子技能**。当用户有明确的修改操作意图时,应直接加载该子技能而非本指南。
148
-
149
- ---
150
-
151
- ### sql-to-dt/ — SQL 转 DT 自动转换
152
-
153
- 将 Hive/Spark 等任意批处理系统的 CREATE TABLE DDL + INSERT OVERWRITE 全自动转换为 Dynamic Table DDL 及配套文件(refresh、prev_refresh、backfill)。
154
-
155
- 详细转换规则参见 sql-to-dt 子技能。
156
-
157
- ---
158
-
159
- ### best-practices/ — 最佳实践与避坑指南
160
-
161
- **包含内容:**
162
-
163
- - **performance-optimization.md** — 性能优化策略
164
- - 核心原则:变更量占比(< 5% 适合增量)、算子类型(INNER JOIN 快于 OUTER JOIN)、数据局部性
165
- - SQL 优化技巧:优先 INNER JOIN、减少 DISTINCT、窗口函数必须有 PARTITION BY、使用分区条件限制数据范围
166
- - 管道拆分:将复杂 DT 拆分为多个阶段
167
-
168
- - **dimension-table-join-guide.md** — 维度表 JOIN 场景详解
169
- - 核心机制:维度表变更被忽略,仅事实表变更触发增量计算
170
- - 配置方式:TBLPROPERTIES('mv_const_tables'='dim1,dim2') 或 Session 配置
171
- - 推荐场景:码表/字典表、T+1 维度 + 实时事实表、大事实 JOIN 小维度
172
- - 不推荐场景:频繁更新的维度且需要实时一致性
173
- - 数据修正:维度表变更后必须使用全量刷新
174
-
175
- - **non-partitioned-merge-into-warning.md** — 非分区 DT + 连续写入风险告警
176
- - 触发条件:DT 是非分区表 + 源表连续写入 + SQL 含 ROW_NUMBER() 去重
177
- - 三大风险:存储无限增长、归档引发性能灾难、无法过滤归档删除
178
- - 推荐替代方案:MERGE INTO + Table Stream(归档免疫、独立生命周期管理)
179
-
180
- - **scheduling-guide.md** — 调度方式选择指南
181
- - 两种方式对比:DDL 内置调度(REFRESH INTERVAL)vs Studio Task 调度
182
- - 有 Studio 时始终推荐 Studio Task:支持上下游依赖、统一告警、可视化监控
183
- - DDL 内置调度的弊端:无告警、无依赖编排、只能手动 SQL 查询刷新状态
184
- - Studio Task 配置要点:必须开启自依赖、配置失败/超时告警、按需配置上游依赖
185
- - 多级 DT 管道的调度编排方式
186
-
187
- **适用问题:**
188
- - "动态表性能怎么优化?"
189
- - "维度表 JOIN 怎么配置?"
190
- - "非分区动态表有什么风险?"
191
- - "什么时候不应该用动态表?"
192
- - "动态表调度用 REFRESH INTERVAL 还是 Studio Task?"
193
- - "动态表刷新失败怎么收到告警?"
194
-
195
- ---
196
-
197
- ## 路由决策树
198
-
199
- ```
200
- 用户提问
201
-
202
- ├─ 包含修改操作关键词?
203
- │ ("修改动态表"、"加列"、"改间隔"、"暂停"、"ALTER DYNAMIC TABLE")
204
- │ └─ 是 → 立即加载 dynamic-table-alter 子技能
205
-
206
- ├─ 包含 SQL 转换关键词?
207
- │ ("转换DT"、"sql to dt"、"INSERT OVERWRITE转DT"、"DDL转换"、"创建动态表")
208
- │ └─ 是 → 立即加载 sql-to-dt 子技能
209
-
210
- └─ 通用咨询/学习?
211
- ("动态表怎么用"、"最佳实践"、"性能优化"、"增量配置")
212
- └─ 是 → 提供本指南的参考文档
213
- ```
214
-
215
- ---
216
-
217
- ## 使用建议
218
-
219
- 1. **首次学习**:从 dt-creator/ 开始,了解 DT 的声明策略和配置项
220
- 2. **迁移场景**:使用 sql-to-dt 子技能批量转换现有 ETL
221
- 3. **日常运维**:使用 dynamic-table-alter 子技能修改 DT 结构
222
- 4. **性能调优**:参考 best-practices/ 中的优化建议和避坑指南
223
- 5. **调度配置**:有 Studio 时始终使用 Studio Task 调度,参考 best-practices/scheduling-guide.md
224
-
225
- ---
226
-
227
- ## 相关技能
228
-
229
- - **dynamic-table-alter** — 修改动态表的操作型子技能(10 种修改操作)
230
- - **sql-to-dt** — SQL 转 DT 的转换型子技能(6 步自动转换工作流)
@@ -1,253 +0,0 @@
1
- # 维度表 JOIN 场景详解
2
-
3
- ## 核心机制
4
-
5
- 将某张表标记为维度表(dimension table)后,增量引擎会将该表的变更数据视为**空**。即:
6
- - 维度表的任何数据变更(INSERT/UPDATE/DELETE)都**不会触发增量计算**
7
- - 增量计算时,维度表始终读取**最新全量数据**
8
- - 只有非维度表(事实表)的变更才会驱动增量刷新
9
-
10
- ## 配置方式
11
-
12
- ```sql
13
- -- 方式1:DT 表属性(推荐,跟随 DT 定义)
14
- CREATE DYNAMIC TABLE my_dt
15
- TBLPROPERTIES('mv_const_tables'='dim_table1,dim_table2')
16
- AS SELECT ...;
17
-
18
- -- 方式2:Session 配置(在 REFRESH 前设置,灵活可动态调整)
19
- set CZ_OPTIMIZER_INCREMENTAL_DIMENSION_TABLES=dim_table1:dim_table2
20
- ```
21
-
22
- ## 各 JOIN 类型下的增量行为
23
-
24
- ### A LEFT JOIN B(B 为维度表)
25
-
26
- 这是最常见的维度表 JOIN 场景。
27
-
28
- **Case 1:A 有增量数据,B 无变化**
29
- ```
30
- 增量计划:A 的变更数据 LEFT JOIN B 的全量数据
31
- ```
32
- - 新增的 A 行与 B 的最新数据做 LEFT JOIN
33
- - 如果 JOIN 上 → 输出完整行
34
- - 如果没 JOIN 上 → B 侧输出 NULL
35
- - ✅ 结果正确
36
-
37
- **Case 2:B 有数据变更,A 无变化**
38
- ```
39
- 增量计划:不触发计算(变更数据为空)
40
- ```
41
- - B 的变更被完全忽略
42
- - 之前 A 行没 JOIN 上 B 输出的 `(xxx, NULL)` 不会被修正为 `(xxx, yyy)`
43
- - 之前 A 行 JOIN 上的旧 B 数据不会被更新为新值
44
- - ⚠️ 结果与全量重算不一致,但这是**预期行为**
45
-
46
- **Case 3:A 和 B 同时有变化**
47
- ```
48
- 增量计划:A 的变更数据 LEFT JOIN B 的全量数据
49
- ```
50
- - 只处理 A 的增量,B 的变更被忽略
51
- - 新增的 A 行会 JOIN 到 B 的最新数据
52
- - 但已有的 A 行不会因 B 的变更而更新
53
- - ⚠️ 新旧数据可能存在不一致
54
-
55
- ### A INNER JOIN B(B 为维度表)
56
-
57
- **Case 1:A 有增量数据,B 无变化**
58
- ```
59
- 增量计划:A 的变更数据 INNER JOIN B 的全量数据
60
- ```
61
- - 新增的 A 行与 B 做 INNER JOIN
62
- - JOIN 不上的 A 行被丢弃
63
- - ✅ 结果正确
64
-
65
- **Case 2:B 有数据变更,A 无变化**
66
- ```
67
- 增量计划:不触发计算
68
- ```
69
- - B 新增了能匹配已有 A 行的数据 → 不会产出新结果
70
- - B 删除了匹配已有 A 行的数据 → 已输出的结果不会被撤回
71
- - ⚠️ 结果与全量重算不一致
72
-
73
- ### 多表 JOIN 中的维度表
74
-
75
- ```sql
76
- -- t2, t3 都是维度表
77
- CREATE DYNAMIC TABLE dt
78
- TBLPROPERTIES('mv_const_tables'='t2,t3')
79
- AS
80
- SELECT t1.*, t2.v1, t3.v1
81
- FROM t1
82
- LEFT JOIN t2 ON t1.id = t2.id
83
- LEFT JOIN t3 ON t1.id = t3.id;
84
- ```
85
-
86
- - 只有 t1 的变更会触发增量计算
87
- - t2、t3 的变更都被忽略
88
- - 增量计划:t1 的变更数据 LEFT JOIN t2 的全量数据 LEFT JOIN t3 的全量数据
89
-
90
- ## 适合使用维度表的场景
91
-
92
- ### ✅ 推荐场景
93
-
94
- 1. **码表/字典表 JOIN**
95
- - 如:地区码表、产品分类表、状态码映射表
96
- - 特点:数据量小、极少变更、即使变更也不影响历史分析
97
- ```sql
98
- -- 地区码表几乎不变
99
- TBLPROPERTIES('mv_const_tables'='dim_region')
100
- ```
101
-
102
- 2. **T+1 维度表 + 实时事实表**
103
- - 维度表每天批量更新一次,事实表持续写入
104
- - 在两次维度表更新之间,维度表可视为不变
105
- ```sql
106
- -- 用户画像表每天更新,订单表实时写入
107
- TBLPROPERTIES('mv_const_tables'='dim_user_profile')
108
- ```
109
-
110
- 3. **配置表 JOIN**
111
- - 如:业务规则配置、阈值配置、权重配置
112
- - 变更频率极低,且变更后可以手动触发全量刷新
113
- ```sql
114
- TBLPROPERTIES('mv_const_tables'='config_rules')
115
- ```
116
-
117
- 4. **大事实表 JOIN 小维度表,且对维度表变更的实时性要求低**
118
- - 核心诉求是事实表的增量计算性能
119
- - 维度表偶尔变更后,可以接受短暂的数据不一致
120
- ```sql
121
- -- 商品信息表偶尔更新,订单表持续写入
122
- TBLPROPERTIES('mv_const_tables'='dim_product')
123
- ```
124
-
125
- 5. **不支持 time travel 的外部表作为 JOIN 右表**
126
- - 外部表无法提供变更数据,标记为维度表后可以正常进行增量计算
127
- - 增量引擎会读取外部表的最新快照
128
- ```sql
129
- -- 外部 MySQL 表不支持 time travel
130
- TBLPROPERTIES('mv_const_tables'='external_mysql_table')
131
- ```
132
-
133
- ### ❌ 不推荐场景
134
-
135
- 1. **维度表频繁更新且要求结果实时一致**
136
- - 如:用户状态表每分钟更新,且下游报表要求实时反映最新状态
137
- - 此时不应标记为维度表,应让两侧都参与增量计算
138
-
139
- 2. **维度表变更会影响聚合结果的正确性**
140
- - 如:价格表更新后,历史订单的金额计算应该用旧价格
141
- - 但维度表标记后,新的事实行会 JOIN 到新价格,旧事实行保持旧价格
142
- - 如果业务要求所有行统一使用最新价格,不应使用维度表
143
-
144
- 3. **维度表数据量大且变更频繁**
145
- - 维度表标记的优化收益来自跳过变更数据的计算
146
- - 如果维度表本身很大且频繁变更,应该考虑让它正常参与增量
147
-
148
- ## 维度表变更后的数据订正
149
-
150
- 由于维度表的变更不会触发增量计算,当维度表发生了重要变更(如修正了错误数据、更新了映射关系),DT 中已有的结果不会自动更新。**如果需要订正数据,必须执行全量刷新。**
151
-
152
- ```sql
153
- -- 强制全量刷新(推荐)
154
- set cz.optimizer.incremental.force.full.refresh=true
155
- REFRESH DYNAMIC TABLE my_dt;
156
- -- 刷新完成后记得关闭,否则后续每次都是全量
157
- set cz.optimizer.incremental.force.full.refresh=false
158
-
159
- -- 如果是分区表,也可以只全量刷新指定分区
160
- set cz.optimizer.incremental.force.full.refresh=true
161
- set dt.args.ds=2025-01-01
162
- REFRESH DYNAMIC TABLE my_dt PARTITION(ds = '2025-01-01');
163
- set cz.optimizer.incremental.force.full.refresh=false
164
- ```
165
-
166
- 配置说明:
167
- - `cz.optimizer.incremental.force.full.refresh`:默认 `false`。设为 `true` 后,下一次 REFRESH 会忽略增量逻辑,对所有源表做全量扫描重算
168
- - 该配置是 session 级别的,刷新完成后需要手动设回 `false`,否则后续所有 REFRESH 都会走全量
169
- - backfill 模式(`cz.optimizer.incremental.backfill.enabled=TRUE`)也会自动开启全量刷新
170
-
171
- ## 性能收益
172
-
173
- 标记维度表后的优化效果:
174
- - **跳过维度表的变更数据扫描**:不需要读取维度表的变更日志
175
- - **简化增量计划**:只需要用事实表的变更数据 JOIN 维度表的全量数据,不需要反向计算
176
-
177
- ## ⚠️ 开启维度表后可能出现的数据不一致与重复
178
-
179
- 标记维度表是一种**用一致性换性能**的权衡。以下是具体会出现问题的场景,使用前务必评估业务是否可以接受。
180
-
181
- ### 场景 1:LEFT JOIN 维度表更新导致 NULL 不被修正
182
-
183
- ```sql
184
- -- DT 定义
185
- SELECT order.*, product.name
186
- FROM order LEFT JOIN product ON order.pid = product.id;
187
- -- product 标记为维度表
188
- ```
189
-
190
- | 时间 | 事件 | DT 中的结果 | 全量重算应有的结果 |
191
- |------|------|------------|------------------|
192
- | T1 | order 插入 (pid=100),product 中无 id=100 | (pid=100, name=NULL) | (pid=100, name=NULL) |
193
- | T2 | product 插入 id=100, name='手机' | (pid=100, name=NULL) **不变** | (pid=100, name='手机') |
194
-
195
- **原因**:product 的变更不触发增量计算,T1 输出的 NULL 行永远不会被修正。
196
-
197
- ### 场景 2:INNER JOIN 维度表新增数据导致结果缺失
198
-
199
- ```sql
200
- SELECT order.*, product.name
201
- FROM order INNER JOIN product ON order.pid = product.id;
202
- -- product 标记为维度表
203
- ```
204
-
205
- | 时间 | 事件 | DT 中的结果 | 全量重算应有的结果 |
206
- |------|------|------------|------------------|
207
- | T1 | order 插入 (pid=200),product 中无 id=200 | 无输出(INNER JOIN 不匹配) | 无输出 |
208
- | T2 | product 插入 id=200, name='电脑' | **仍然无输出** | (pid=200, name='电脑') |
209
-
210
- **原因**:product 的新增不触发增量,已有的 order 行不会被重新 JOIN。
211
-
212
- ### 场景 3:维度表删除/更新导致过期数据残留
213
-
214
- ```sql
215
- SELECT order.*, product.name, product.price
216
- FROM order LEFT JOIN product ON order.pid = product.id;
217
- -- product 标记为维度表
218
- ```
219
-
220
- | 时间 | 事件 | DT 中的结果 | 全量重算应有的结果 |
221
- |------|------|------------|------------------|
222
- | T1 | order 插入 (pid=100),product id=100 price=99 | (pid=100, price=99) | (pid=100, price=99) |
223
- | T2 | product 更新 id=100 price=**199** | (pid=100, price=**99**) 旧值残留 | (pid=100, price=199) |
224
- | T3 | product 删除 id=100 | (pid=100, price=**99**) 仍然残留 | (pid=100, name=NULL) |
225
-
226
- **原因**:维度表的 UPDATE/DELETE 都被忽略,已输出的行保持旧值。
227
-
228
- ### 场景 4:维度表 + 聚合导致聚合结果不一致
229
-
230
- ```sql
231
- SELECT product.category, SUM(order.amount) as total
232
- FROM order LEFT JOIN product ON order.pid = product.id
233
- GROUP BY product.category;
234
- -- product 标记为维度表
235
- ```
236
-
237
- | 时间 | 事件 | DT 中的结果 | 全量重算应有的结果 |
238
- |------|------|------------|------------------|
239
- | T1 | order (pid=1, amount=100),product (id=1, category='A') | category='A', total=100 | 同左 |
240
- | T2 | product 更新 id=1 的 category 从 'A' 改为 'B' | category='A', total=100 **不变** | category='B', total=100 |
241
- | T3 | order 新增 (pid=1, amount=200) | category='B', total=200(新行 JOIN 到新 category)| category='B', total=300 |
242
-
243
- **原因**:T2 的 category 变更不触发重算,T1 的旧数据仍按旧 category 聚合。T3 的新数据按新 category 聚合。最终结果中同一个 pid 的数据被分到了不同 category,聚合结果错乱。
244
-
245
- ### 总结:什么时候结果会不一致
246
-
247
- | 维度表变更类型 | LEFT JOIN | INNER JOIN |
248
- |--------------|-----------|------------|
249
- | 新增匹配行 | 旧 fact 行的 NULL 不被修正 | 旧 fact 行不会产出新结果 |
250
- | 更新已有行 | 旧 fact 行保持旧值 | 旧 fact 行保持旧值 |
251
- | 删除已有行 | 旧 fact 行保持旧值(不会变 NULL) | 旧 fact 行不会被撤回 |
252
-
253
- **核心原则**:维度表的任何变更都不会影响已经输出的结果行。只有新的事实表增量才会 JOIN 到维度表的最新快照。
@@ -1,124 +0,0 @@
1
- # Medallion 架构与 Table Stream 组合模式
2
-
3
- ## Medallion 三层管道
4
-
5
- ```
6
- Bronze(原始数据)
7
- ↓ Dynamic Table(清洗,INCREMENTAL)
8
- Silver(清洗数据)
9
- ↓ Dynamic Table(聚合,FULL)
10
- Gold(指标数据)
11
- ↓ BI 工具直接查询
12
- ```
13
-
14
- ### Bronze → Silver(增量清洗)
15
-
16
- ```sql
17
- -- 前提:源表开启变更跟踪
18
- ALTER TABLE bronze.raw_orders SET PROPERTIES ('change_tracking' = 'true');
19
-
20
- CREATE DYNAMIC TABLE IF NOT EXISTS silver.orders_cleaned
21
- REFRESH INTERVAL 15 MINUTE vcluster default
22
- AS
23
- SELECT
24
- order_id,
25
- customer_id,
26
- CAST(amount AS DECIMAL(18,2)) AS amount,
27
- CAST(created_at AS TIMESTAMP) AS created_at,
28
- COALESCE(region, 'unknown') AS region
29
- FROM bronze.raw_orders
30
- WHERE order_id IS NOT NULL AND amount > 0;
31
- ```
32
-
33
- ### Silver → Gold(聚合指标,通常 FULL)
34
-
35
- ```sql
36
- CREATE DYNAMIC TABLE IF NOT EXISTS gold.orders_daily_summary
37
- REFRESH INTERVAL 60 MINUTE vcluster default
38
- AS
39
- SELECT
40
- DATE(created_at) AS stat_date,
41
- region,
42
- COUNT(*) AS order_count,
43
- SUM(amount) AS total_revenue,
44
- COUNT(DISTINCT customer_id) AS unique_customers
45
- FROM silver.orders_cleaned
46
- GROUP BY 1, 2;
47
- ```
48
-
49
- ---
50
-
51
- ## 与 Table Stream 组合(事件驱动)
52
-
53
- Table Stream 捕获源表变更,Dynamic Table 消费 Stream 做增量处理。
54
-
55
- ### 基本模式
56
-
57
- ```sql
58
- -- 1. 源表开启变更跟踪
59
- ALTER TABLE bronze.raw_orders SET PROPERTIES ('change_tracking' = 'true');
60
-
61
- -- 2. 创建 Table Stream
62
- CREATE TABLE STREAM bronze.orders_stream
63
- ON TABLE bronze.raw_orders
64
- WITH PROPERTIES ('TABLE_STREAM_MODE' = 'STANDARD');
65
-
66
- -- 3. Dynamic Table 消费 Stream
67
- -- 注意:Stream 作为 DT 源时,每次刷新会消费 offset
68
- CREATE DYNAMIC TABLE IF NOT EXISTS silver.orders_incremental
69
- REFRESH INTERVAL 5 MINUTE vcluster default
70
- AS
71
- SELECT order_id, customer_id, amount, status
72
- FROM bronze.orders_stream
73
- WHERE __change_type IN ('INSERT', 'UPDATE_AFTER');
74
- ```
75
-
76
- ### MERGE INTO + Table Stream(替代非分区 DT 的去重场景)
77
-
78
- 当需要按主键去重且源表持续写入时,推荐用 MERGE INTO 替代 Dynamic Table:
79
-
80
- ```sql
81
- -- 1. 创建 Table Stream
82
- CREATE TABLE STREAM source_stream ON TABLE source_table
83
- WITH PROPERTIES ('TABLE_STREAM_MODE' = 'STANDARD', 'SHOW_INITIAL_ROWS' = 'TRUE');
84
-
85
- -- 2. 创建目标表
86
- CREATE TABLE target_table (
87
- id BIGINT,
88
- col1 STRING,
89
- col2 INT,
90
- event_time TIMESTAMP
91
- );
92
-
93
- -- 3. 定时调度 MERGE INTO 消费 Stream
94
- MERGE INTO target_table t
95
- USING (
96
- SELECT id, col1, col2, event_time,
97
- CASE WHEN `value` IS NULL OR `value` = '' THEN 'DELETE' ELSE 'UPSERT' END AS op
98
- FROM source_stream
99
- ) s ON t.id = s.id
100
- WHEN MATCHED AND s.op = 'UPSERT' THEN UPDATE SET
101
- t.col1 = s.col1, t.col2 = s.col2, t.event_time = s.event_time
102
- WHEN NOT MATCHED AND s.op = 'UPSERT' THEN INSERT
103
- (id, col1, col2, event_time) VALUES (s.id, s.col1, s.col2, s.event_time);
104
- ```
105
-
106
- ---
107
-
108
- ## 实时报表物化
109
-
110
- ```sql
111
- -- 每小时刷新销售汇总,供 BI 工具直接查询
112
- CREATE DYNAMIC TABLE IF NOT EXISTS rpt.sales_hourly
113
- REFRESH INTERVAL 60 MINUTE vcluster default
114
- AS
115
- SELECT
116
- DATE_TRUNC('hour', order_time) AS hour_bucket,
117
- product_category,
118
- SUM(amount) AS revenue,
119
- COUNT(*) AS order_cnt,
120
- AVG(amount) AS avg_order_value
121
- FROM silver.orders_cleaned
122
- WHERE order_time >= DATEADD(day, -30, CURRENT_DATE)
123
- GROUP BY 1, 2;
124
- ```