跳转到主要内容

Documentation Index

Fetch the complete documentation index at: https://docs.chainstream.io/llms.txt

Use this file to discover all available pages before exploring further.

什么是指标(Metrics)

指标是 Cube Record 类型上可作为字段选用的聚合函数,让你在 GraphQL 查询中直接计算统计量,无需后置处理。当与维度字段一起选择时,查询会按所选维度分组,并为每组计算指标。 支持的指标:
MetricSQL 等价说明
countCOUNT(*)COUNT(column)计数行或不同取值
sumSUM(column)数值求和
avgAVG(column)数值平均
minMIN(column)最小值
maxMAX(column)最大值
uniqCOUNT(DISTINCT column)不同取值个数

Record 类型上的指标字段

指标以顶层字段形式出现在各 Cube 的 Record 类型上。并非每个 Cube 都支持全部指标——取决于 Cube 定义。
type DEXTradesRecord {
  # Dimension fields...
  Block { ... }
  Trade { ... }

  # Metric fields
  count: Int
  sum(of: DEXTradesSumOf!): Float
}
在字段选择中加入指标字段即可使用:
query {
  Solana {
    DEXTrades(
      tokenAddress: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
      where: { Block: { Time: { after: "2025-03-27T00:00:00Z" } } }
    ) {
      count
      Trade { Dex { ProtocolName } }
    }
  }
}
该查询按协议名对 DEX 成交分组,并返回每组的笔数。

of 参数

sumavgminmaxuniq 等指标需要 of 参数,用于指定对哪个维度聚合。of 的值为按 Cube 生成的枚举,命名遵循维度路径约定。
sum(of: Trade_Buy_Amount)
avg(of: Trade_Buy_PriceInUSD)
min(of: Block_Time)
max(of: Trade_Sell_Amount)
uniq(of: Trade_Buy_Account_Owner)

示例:按 DEX 统计买入总量

query {
  Solana {
    DEXTrades(
      tokenAddress: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
      where: { Block: { Time: { after: "2025-03-27T00:00:00Z" } } }
    ) {
      count
      sum(of: Trade_Buy_Amount)
      Trade { Dex { ProtocolName } }
    }
  }
}
响应:
{
  "data": {
    "Solana": {
      "DEXTrades": [
        {
          "count": 1842,
          "sum": 2847291.45,
          "Trade": { "Dex": { "ProtocolName": "Raydium" } }
        },
        {
          "count": 923,
          "sum": 1293847.12,
          "Trade": { "Dex": { "ProtocolName": "Orca" } }
        }
      ]
    }
  }
}

count — 计数行数

不带 ofcount 统计每组内的总行数(等价于 COUNT(*)):
query {
  Solana {
    DEXTrades(
      where: { Block: { Time: { after: "2025-03-27T00:00:00Z" } } }
    ) {
      count
    }
  }
}
与维度字段一起使用时,返回每组的计数:
query {
  Solana {
    DEXTrades(
      where: { Block: { Time: { after: "2025-03-27T00:00:00Z" } } }
    ) {
      count
      Trade { Dex { ProtocolName } }
    }
  }
}

uniq — 统计不同值

uniq 对应 SQL 中的 COUNT(DISTINCT column),用于统计某维度的不同取值数量:
query {
  Solana {
    DEXTrades(
      tokenAddress: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
      where: { Block: { Time: { after: "2025-03-27T00:00:00Z" } } }
    ) {
      uniq(of: Trade_Buy_Account_Owner)
    }
  }
}
该查询返回今日在 Solana 上交易 USDC 的独立买方钱包数量。

selectWhere — 类 HAVING 筛选

selectWhere 用于在聚合结果上筛选,类似 SQL 的 HAVING。它在分组与聚合之后应用,可按指标值过滤分组。
query {
  Solana {
    DEXTrades(
      where: { Block: { Time: { after: "2026-04-01T00:00:00Z" } } }
    ) {
      count(selectWhere: { gt: "100" })
      Trade { Dex { ProtocolName } }
    }
  }
}
该查询只返回成交笔数超过 100 的 DEX 协议——笔数更少的协议不会出现在结果中。
selectWhere 的值必须为字符串(例如 "100" 而非 100)。服务端会按数值解析。
selectWhere 支持下列比较运算符:
运算符说明
gt大于
ge大于等于
lt小于
le小于等于
eq等于
已知限制: 使用 selectWhere 时,orderBy 引用的字段须属于隐式 GROUP BY 的一部分(即你正在选择的字段)或为聚合结果。按不在 GROUP BY 中的字段排序(例如 Block_Time)会导致数据库报错。

实用示例:顶级交易者

查找某代币今日按成交笔数排序的前 10 个钱包,并展示其买入总量与独立成交相关统计:
query TopTraders {
  Solana {
    DEXTrades(
      tokenAddress: "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"
      where: {
        Block: { Time: { after: "2025-03-27T00:00:00Z" } }
      }
      orderBy: {descending: Block_Time}
      limit: { count: 10 }
    ) {
      count
      sum(of: Trade_Buy_Amount)
      Trade {
        Buy {
          Account { Owner }
        }
      }
    }
  }
}
响应:
{
  "data": {
    "Solana": {
      "DEXTrades": [
        {
          "count": 47,
          "sum": 892341023.5,
          "Trade": {
            "Buy": {
              "Account": { "Owner": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU" }
            }
          }
        },
        {
          "count": 31,
          "sum": 451203847.2,
          "Trade": {
            "Buy": {
              "Account": { "Owner": "3kMq5RezM9XBbBGRNxP9vXkJHAfG8S7gn5WfBsHFQr7T" }
            }
          }
        }
      ]
    }
  }
}

组合多个指标

单个查询中可选择多个指标字段:
query {
  Solana {
    DEXTrades(
      tokenAddress: "So11111111111111111111111111111111111111112"
      where: {
        Block: { Time: { after: "2025-03-27T00:00:00Z" } }
      }
    ) {
      count
      sum(of: Trade_Buy_Amount)
      min(of: Trade_Buy_PriceInUSD)
      max(of: Trade_Buy_PriceInUSD)
      uniq(of: Trade_Buy_Account_Owner)
      Trade { Dex { ProtocolName } }
    }
  }
}
该查询按 DEX 返回:成交笔数、总成交量、价格区间与独立交易者数——一次查询完成。

指标 vs 预聚合 Cube

常见问题:应该在 DWD Cube 上用指标,还是直接查 DWM/DWS Cube?
方式适用场景性能
DWD 上的指标(如 DEXTrades.count自定义聚合、即席分组、灵活时间窗口较慢——查询时在原始事件上聚合
DWM Cube(如 PairsTokens标准时序分析、OHLC 图、随时间变化的成交量较快——读取预计算的分钟级汇总
DWS Cube(如 TokenHoldersWalletTokenPnL当前快照、累计总量、排行榜最快——读取预聚合汇总数据
经验法则:若 DWM/DWS 已覆盖你的场景——它们已预聚合,通常明显更快。仅在需要预置 Cube 不支持的自定义分组或聚合逻辑时,再回退到带指标的 DWD Cube。

决策指引

使用 Pairs(DWM)。已按分钟预计算 open/high/low/close/volume,无需自己对 DEXTrades 做聚合。
使用 Tokens(DWM)。已按分钟预聚合成交笔数、成交量与独立交易者数。
使用 TokenHolders(DWS)。最新每位持有者余额已预计算——比聚合 BalanceUpdates 快得多。
使用 DEXTrades,以 count + sum(of: Trade_Buy_Amount)Trade.Dex.ProtocolName 分组。无现成 Cube 覆盖时,DWD 指标是合适选择。
使用 WalletTokenPnL(DWS)。买入/卖出量与成交笔数已按钱包–代币对预计算。

下一步

数据 Cube

浏览全部 25 个 Cube 及其字段结构。

查询示例

查看包含指标与聚合的实战查询示例。