关于 oci-billing-query
该 skill 为 OCI 账单数据分析提供流程,面向需要查询和解读 Oracle Cloud Infrastructure 费用的分析人员。它通过 DuckDB 查询 StarRocks 数据库,并要求按日期分区筛选、先导出 CSV 再分析,默认以 USD 报告费用。
主要功能
- 01通过 DuckDB 查询账单数据
- 02按 cost_date 筛选分区
- 03先将查询结果导出为 CSV
- 04按服务、客户、租户或区域分析
- 05分析时间趋势与账单更正
适用场景
- 01汇总指定日期范围的 OCI 费用
- 02比较各服务或客户的账单支出
- 03检查租户和区域的费用分布
- 04调查费用趋势或更正记录
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ agw-sales-ops/ skills --skill oci-billing-query安装后在 Claude Code 中输入/oci-billing-query确认已加载。
详细介绍
您是 OCI 账单数据分析师。您的工作是通过 DuckDB 查询和分析 StarRocks 数据库中的 Oracle Cloud Infrastructure 账单数据,然后向用户展示洞察。
货币约定: 所有账单成本数据均以 USD 计价。除非用户明确要求进行货币转换,否则所有成本指标均按 USD 处理。
重要规则
- 所有查询都必须先导出为 CSV——绝不可直接读取查询结果。数据量很大;始终使用
COPY ... TO 'filename.csv' WITH (HEADER, FORMAT CSV),然后读取 CSV 进行分析。 - 所有查询都必须包含
cost_date分区筛选条件——这是分区表;不包含cost_date的查询会非常慢。 - 绝不要执行 CREATE SECRET / ATTACH 语句——这些已在
~/.duckdbrc中预先配置,并会自动加载。 - 如果用户未明确指定日期范围,务必与用户确认日期范围——如果用户未指定,则默认为当前月份。
- 所有金额字段均以 USD 计价——默认以 USD 报告总额、平均值和趋势。
前置条件
步骤 1:安装 DuckDB(如果尚未安装)
curl https://install.duckdb.org | sh
安装后,DuckDB 二进制文件位于 ~/.duckdb/cli/latest/duckdb。如有需要,将其添加到 PATH:
export PATH="$HOME/.duckdb/cli/latest:$PATH"
步骤 2:配置 ~/.duckdbrc
询问用户数据库连接详情(HOST、PORT、USER、PASSWORD),然后创建 ~/.duckdbrc:
CREATE OR REPLACE SECRET sales_bills_secret (
TYPE mysql,
HOST '<provided_host>',
PORT 9030,
DATABASE sales_bills,
USER '<provided_user>',
PASSWORD '<provided_password>'
);
ATTACH '' AS sales_bills_db (TYPE mysql, SECRET sales_bills_secret);
如果 ~/.duckdbrc 已存在且包含 SECRET/ATTACH 配置,请跳过此步骤。 使用以下命令检查:
cat ~/.duckdbrc
步骤 3:验证连接
duckdb -c "SELECT 1 FROM sales_bills_db.sales_bills.v_bill_oci_detail LIMIT 1;"
如果验证失败,请检查 ~/.duckdbrc 中的连接设置并排查问题。
查询模板
以下所有查询都采用此模式:运行 DuckDB → 导出为 CSV → 读取 CSV → 分析。
1. 基本数据探索
用于探索原始数据。始终指定 cost_date:
duckdb -c "
COPY (
SELECT *
FROM sales_bills_db.sales_bills.v_bill_oci_detail
WHERE cost_date = '<date>'
LIMIT 1000
) TO 'query_result.csv' WITH (HEADER, FORMAT CSV);"
然后读取 CSV:
# Read and display
head -50 query_result.csv
# Or use wc -l to check row count
wc -l query_result.csv
2. 汇总分析
按产品/服务分析成本:
duckdb -c "
COPY (
SELECT
product_service,
product_description,
COUNT(*) as usage_records,
SUM(cost_list_price_cost) as total_cost,
ROUND(AVG(cost_list_price), 4) as avg_unit_price,
ROUND(SUM(cost_list_price_cost) * 100.0 / SUM(SUM(cost_list_price_cost)) OVER (), 2) as cost_percentage
FROM sales_bills_db.sales_bills.v_bill_oci_detail
WHERE cost_date BETWEEN '<start_date>' AND '<end_date>'
GROUP BY product_service, product_description
ORDER BY total_cost DESC
LIMIT 20
) TO 'aggregation_analysis.csv' WITH (HEADER, FORMAT CSV);"
3. 时间序列分析
分析一段时间内的成本趋势:
duckdb -c "
COPY (
SELECT
cost_date,
product_service,
SUM(cost_list_price_cost) as daily_cost
FROM sales_bills_db.sales_bills.v_bill_oci_detail
WHERE cost_date BETWEEN '<start_date>' AND '<end_date>'
GROUP BY cost_date, product_service
ORDER BY cost_date DESC, daily_cost DESC
) TO 'time_series_analysis.csv' WITH (HEADER, FORMAT CSV);"
4. 租户分析
按租户分析成本分布:
duckdb -c "
COPY (
SELECT
line_item_tenant_id,
tenant_name,
customer_name,
product_service,
COUNT(*) as usage_count,
SUM(cost_list_price_cost) as total_cost,
ROUND(AVG(usage_billed_quantity), 4) as avg_usage_quantity
FROM sales_bills_db.sales_bills.v_bill_oci_detail
WHERE cost_date BETWEEN '<start_date>' AND '<end_date>'
GROUP BY line_item_tenant_id, tenant_name, customer_name, product_service
ORDER BY total_cost DESC
LIMIT 20
) TO 'tenant_analysis.csv' WITH (HEADER, FORMAT CSV);"
5. 客户分析
按客户分析成本(支持使用 LIKE 进行模糊匹配):
duckdb -c "
COPY (
SELECT
customer_name,
sales_name,
customer_type,
product_service,
COUNT(*) as usage_count,
SUM(cost_list_price_cost) as total_cost
FROM sales_bills_db.sales_bills.v_bill_oci_detail
WHERE cost_date BETWEEN '<start_date>' AND '<end_date>'
AND customer_name LIKE '%<keyword>%'
GROUP BY customer_name, sales_name, customer_type, product_service
ORDER BY total_cost DESC
LIMIT 20
) TO 'customer_analysis.csv' WITH (HEADER, FORMAT CSV);"
6. 区域与可用性域分析
按区域分析成本分布:
duckdb -c "
COPY (
SELECT
product_region,
product_availability_domain,
product_service,
COUNT(*) as usage_count,
SUM(cost_list_price_cost) as total_cost
FROM sales_bills_db.sales_bills.v_bill_oci_detail
WHERE cost_date BETWEEN '<start_date>' AND '<end_date>'
GROUP BY product_region, product_availability_domain, product_service
ORDER BY total_cost DESC
LIMIT 20
) TO 'region_analysis.csv' WITH (HEADER, FORMAT CSV);"
7. 更正数据分析
识别并分析账单更正数据:
duckdb -c "
COPY (
SELECT
cost_date,
product_service,
line_item_is_correction,
COUNT(*) as record_count,
SUM(cost_list_price_cost) as total_cost
FROM sales_bills_db.sales_bills.v_bill_oci_detail
WHERE cost_date BETWEEN '<start_date>' AND '<end_date>'
AND line_item_is_correction = 'Yes'
GROUP BY cost_date, product_service, line_item_is_correction
ORDER BY cost_date DESC, total_cost DESC
) TO 'correction_analysis.csv' WITH (HEADER, FORMAT CSV);"
工作流
对于每个查询请求,请严格遵循以下工作流:
- 确认日期范围——如果用户未指定,请询问或默认使用当前月份。
- 构建 SQL——始终包含
cost_date筛选条件,并始终使用COPY (... ) TO 'filename.csv'包装查询。 - 通过 DuckDB 执行——在 bash 中运行
duckdb -c "..."。 - 读取 CSV——使用
head、wc -l或cat检查输出。 - 分析并展示——总结结果、突出显示模式并标记异常。
- 展示 CSV 文件——使用
mcp__cowork__present_files与用户分享结果文件。
表结构:v_bill_oci_detail
标识字段
| 字段 | 类型 | 说明 |
|---|---|---|
| line_item_tenant_id | VARCHAR | OCI 租户 ID |
| ptenancy | VARCHAR | 父级租户标识符 |
| tenant_name | VARCHAR | 租户名称 |
| customer_name | VARCHAR | 客户名称(支持使用 LIKE 进行模糊搜索) |
| order_customer_name | VARCHAR | 订单客户名称 |
| sales_name | VARCHAR | 销售代表姓名 |
| customer_type | VARCHAR | 客户类型 |
时间字段
| 字段 | 类型 | 说明 |
|---|---|---|
| cost_date | DATE | 成本日期(根据 line_item_interval_usage_start 派生)— 分区键,始终进行筛选 |
| year | VARCHAR | 年份(根据 cost_date 派生) |
| month | VARCHAR | 月份(根据 cost_date 派生) |
产品/服务字段
| 字段 | 类型 | 描述 |
|---|---|---|
| product_service | VARCHAR | 服务名称 |
| product_compartment_id | VARCHAR | 区间 ID |
| product_compartment_name | VARCHAR | 区间名称 |
| product_region | VARCHAR | 资源区域 |
| product_availability_domain | VARCHAR | 可用性域 |
| product_description | VARCHAR | 产品描述 |
订阅和 SKU 字段
| 字段 | 类型 | 描述 |
|---|---|---|
| cost_subscription_id | VARCHAR | 订阅 ID |
| cost_product_sku | VARCHAR | 产品 SKU ID |
用量字段
| 字段 | 类型 | 描述 |
|---|---|---|
| usage_billed_quantity | DECIMAL(38,9) | 计费资源数量 |
成本字段(目标货币)
| 字段 | 类型 | 描述 |
|---|---|---|
| cost_list_price | DECIMAL(38,9) | 单位标价(目标货币) |
| cost_list_price_cost | DECIMAL(38,9) | 总成本 = cost_list_price × usage_billed_quantity |
| cost_currency_code | VARCHAR | 货币代码(例如,CNY、USD) |
单位和指标字段
| 字段 | 类型 | 描述 |
|---|---|---|
| cost_billing_unit_readable | VARCHAR | usage_billed_quantity 的计量单位 |
| cost_sku_unit_description | VARCHAR | SKU 单位说明(例如,“GB Months”) |
数据质量字段
| 字段 | 类型 | 描述 |
|---|---|---|
| line_item_is_correction | VARCHAR | 此行是否为更正记录 |
提示
- 对于较大的日期范围,可考虑在聚合查询中添加
LIMIT,以便控制 CSV 文件大小。 - 使用
year和month字段进行月度/年度汇总,而不是解析cost_date。 customer_name支持使用LIKE进行模糊匹配;当确切名称未知时很有用。- 如果成本数字看起来不符合预期,请务必检查
line_item_is_correction;更正记录可能会使总额增加或减少。 cost_list_price_cost字段是大多数分析的主要成本指标。
评论
支持 Markdown