跳轉到主要內容

什麼是 Metrics?

Metrics 是 Cube Record 型別上可用的聚合函式欄位,可在 GraphQL 查詢中直接計算統計量,無需後置處理。同時選擇指標欄位與維度欄位時,查詢會按所選維度分組,併為每組計算指標。 支援的 metrics:
MetricSQL EquivalentDescription
countCOUNT(*) or COUNT(column)計數行或不同取值
sumSUM(column)數值求和
avgAVG(column)平均值
minMIN(column)最小值
maxMAX(column)最大值
uniqCOUNT(DISTINCT column)不同取值個數

Record 型別上的指標欄位

Metrics 作為每個 Cube Record 型別的頂層欄位出現。並非所有 Cube 都支援全部 metrics — 取決於 Cube 定義。
type DEXTradesRecord {
  # Dimension fields...
  Block { ... }
  Trade { ... }

  # Metric fields
  count: Int
  sum(of: DEXTradesSumOf!): Float
}
在欄位選擇中包含 metric 即可使用:
query {
  DEXTrades(
    network: sol
    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 {
  DEXTrades(
    network: sol
    tokenAddress: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
    where: { Block: { Time: { after: "2025-03-27T00:00:00Z" } } }
  ) {
    count
    sum(of: Trade_Buy_Amount)
    Trade { Dex { ProtocolName } }
  }
}
Response:
{
  "data": {
    "DEXTrades": [
      {
        "count": 1842,
        "sum": 2847291.45,
        "Trade": { "Dex": { "ProtocolName": "Raydium" } }
      },
      {
        "count": 923,
        "sum": 1293847.12,
        "Trade": { "Dex": { "ProtocolName": "Orca" } }
      }
    ]
  }
}

count — 行計數

不帶 ofcount 統計每組總行數(等價於 COUNT(*)):
query {
  DEXTrades(
    network: sol
    where: { Block: { Time: { after: "2025-03-27T00:00:00Z" } } }
  ) {
    count
  }
}
與維度欄位一起使用時,返回每組的計數:
query {
  DEXTrades(
    network: sol
    where: { Block: { Time: { after: "2025-03-27T00:00:00Z" } } }
  ) {
    count
    Trade { Dex { ProtocolName } }
  }
}

uniq — 不同值計數

uniq 對應 SQL 的 COUNT(DISTINCT column),用於統計某維度的不同取值數量:
query {
  DEXTrades(
    network: sol
    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 {
  DEXTrades(
    network: sol
    where: { Block: { Time: { after: "2025-03-27T00:00:00Z" } } }
  ) {
    count(selectWhere: { gt: 100 })
    Trade { Dex { ProtocolName } }
  }
}
僅返回今日成交筆數超過 100 的 DEX 協議 — 筆數更少的協議不會出現在結果中。 selectWhere 支援與 IntFilter/FloatFilter 相同的數值運算子:
OperatorDescription
gt大於
gte大於等於
lt小於
lte小於等於
eq等於
ne不等於

實用示例:Top 交易者

查詢某 token 今日按成交筆數排名前 10 的錢包,並展示其買入總量與筆數相關指標:
query TopTraders {
  DEXTrades(
    network: sol
    tokenAddress: "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"
    where: {
      Block: { Time: { after: "2025-03-27T00:00:00Z" } }
    }
    orderBy: Block_Time_DESC
    limit: { count: 10 }
  ) {
    count
    sum(of: Trade_Buy_Amount)
    Trade {
      Buy {
        Account { Owner }
      }
    }
  }
}
Response:
{
  "data": {
    "DEXTrades": [
      {
        "count": 47,
        "sum": 892341023.5,
        "Trade": {
          "Buy": {
            "Account": { "Owner": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU" }
          }
        }
      },
      {
        "count": 31,
        "sum": 451203847.2,
        "Trade": {
          "Buy": {
            "Account": { "Owner": "3kMq5RezM9XBbBGRNxP9vXkJHAfG8S7gn5WfBsHFQr7T" }
          }
        }
      }
    ]
  }
}

組合多個 Metrics

單次查詢可選擇多個 metric 欄位:
query {
  DEXTrades(
    network: sol
    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 的統計:成交筆數、總成交量、價格區間、獨立交易者數 — 一次查詢完成。

Metrics vs 預聚合 Cube

常見問題:應該在 DWD Cube 上用 metrics,還是直接查 DWM/DWS Cube?
ApproachWhen to UsePerformance
DWD 上的 Metrics(如 DEXTrades.count自定義聚合、即席分組、靈活時間視窗較慢 — 查詢時對原始事件聚合
DWM Cube(如 PairsTokens標準時間序列、OHLC 圖、成交量隨時間快 — 讀取預計算的分鐘級彙總
DWS Cube(如 TokenHoldersWalletTokenPnL當前快照、累計合計、排行榜最快 — 讀取預彙總摘要資料
經驗法則:若 DWM/DWS Cube 已覆蓋你的場景,優先使用 — 它們預聚合且明顯更快。僅在需要自定義分組或預置 Cube 不支援的聚合邏輯時,再回退到帶 metrics 的 DWD Cube。

決策指引

使用 Pairs(DWM)。已按分鐘預計算 open/high/low/close/volume,無需自己對 DEXTrades 聚合。
使用 Tokens(DWM)。已按分鐘預聚合筆數、成交量與獨立交易者。
使用 TokenHolders(DWS)。已預計算每位持有者最新餘額 — 比聚合 BalanceUpdates 快得多。
使用 DEXTrades,按 Trade.Dex.ProtocolName 分組,配合 count + sum(of: Trade_Buy_Amount)。無現成 Cube 時,DWD metrics 是合適選擇。
使用 WalletTokenPnL(DWS)。已預計算每對 wallet-token 的買賣量與筆數。

下一步

資料 Cube

瀏覽全部 25 個 Cube 及其欄位結構。

Query 示例

檢視帶 metrics 與聚合的實戰查詢示例。