> ## 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.

# 排序与分页

> 使用 orderBy 输入对象排序查询结果，并用 limit 分页 — 命名约定、默认值与基于 offset 的分页

## orderBy InputObject

每个 Cube 会生成 `{Cube}OrderBy` 输入对象，包含 `ascending` 与 `descending` 字段。每个字段接受 `CompareFields` 枚举值，命名规则为维度路径以下划线连接：

```
{DimensionGroup}_{DimensionField}
```

嵌套维度逐级拼接：

```
Block_Time
Trade_Buy_Amount
Trade_Buy_PriceInUSD
```

用法：

```graphql theme={null}
orderBy: {descending: Block_Time}      # newest first
orderBy: {ascending: Trade_Buy_Amount}  # smallest amount first
```

### 常见 CompareFields 取值

<div style={{ overflowX: 'auto', width: '100%' }}>
  | CompareFields 值        | 示例用法                                          | Cube                                                                              | 说明            |
  | :--------------------- | :-------------------------------------------- | :-------------------------------------------------------------------------------- | :------------ |
  | `Block_Time`           | `orderBy: {descending: Block_Time}`           | DEXTrades, Transfers, BalanceUpdates, DEXPools, TokenSupplyUpdates, Pairs, Tokens | 最新的在前         |
  | `Block_Time`           | `orderBy: {ascending: Block_Time}`            | DEXTrades, Transfers, BalanceUpdates, DEXPools, TokenSupplyUpdates, Pairs, Tokens | 最旧的在前         |
  | `Interval_Time_Start`  | `orderBy: {ascending: Interval_Time_Start}`   | Pairs, Tokens                                                                     | 最旧的在前（区间起始时间） |
  | `Trade_Buy_Amount`     | `orderBy: {descending: Trade_Buy_Amount}`     | DEXTrades                                                                         | 买入量大的在前       |
  | `Trade_Buy_PriceInUSD` | `orderBy: {descending: Trade_Buy_PriceInUSD}` | DEXTrades                                                                         | USD 价高的在前     |
  | `Transfer_AmountInUSD` | `orderBy: {descending: Transfer_AmountInUSD}` | Transfers                                                                         | USD 转账额大的在前   |
  | `LatestBalanceUSD`     | `orderBy: {descending: LatestBalanceUSD}`     | TokenHolders                                                                      | 持仓 USD 大的在前   |
  | `BuyVolumeUSDState`    | `orderBy: {descending: BuyVolumeUSDState}`    | WalletTokenPnL                                                                    | 买入量 USD 高的在前  |
</div>

<Tip>
  在 [GraphQL IDE](https://ide.chainstream.io) 中用自动补全查看某 Cube 可用的全部 `CompareFields`——输入 `orderBy: {descending:` 后 IDE 会列出可选字段。
</Tip>

### 用法

传入 `orderBy` 输入对象，将 `descending` 或 `ascending` 设为某个 `CompareFields` 值：

```graphql theme={null}
query {
  Solana {
    DEXTrades(
      orderBy: {descending: Block_Time}
      limit: { count: 10 }
    ) {
      Block { Time }
      Trade { Buy { Amount PriceInUSD } }
    }
  }
}
```

<Note>
  `orderBy` 仅接受**单一**方向/字段对。不支持多列排序——查询每次只按一个维度排序。
</Note>

***

## limit 参数

`limit` 控制返回行数，并支持基于 offset 的分页：

```graphql theme={null}
input LimitInput {
  count: Int   # Number of rows to return
  offset: Int  # Number of rows to skip
}
```

### 默认与最大限制

每个 Cube 在省略 `limit` 时有**默认**行数，并有**最大**上限：

| Cube               | 默认 `count` | 最大 `count` |
| :----------------- | :--------- | :--------- |
| DEXTrades          | 25         | 10,000     |
| Transfers          | 25         | 10,000     |
| BalanceUpdates     | 25         | 10,000     |
| DEXPools           | 25         | 10,000     |
| TokenSupplyUpdates | 25         | 10,000     |
| Pairs              | 25         | 10,000     |
| Tokens             | 25         | 10,000     |
| DEXPoolEvents      | 25         | 10,000     |
| TokenHolders       | 25         | 10,000     |
| WalletTokenPnL     | 25         | 10,000     |

<Info>
  若请求的 `count` 超过最大值，服务端会静默截断为最大允许值。
</Info>

***

## 基于 Offset 的分页

使用 `offset` 翻页，模式很直接：

* **第 1 页**：`limit: { count: 50, offset: 0 }`
* **第 2 页**：`limit: { count: 50, offset: 50 }`
* **第 3 页**：`limit: { count: 50, offset: 100 }`

### 示例：代币持有者分页

<Tabs>
  <Tab title="第 1 页">
    ```graphql theme={null}
    query {
      Solana {
        TokenHolders(
          tokenAddress: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
          orderBy: {descending: LatestBalanceUSD}
          limit: { count: 20, offset: 0 }
        ) {
          Holder { Address }
          LatestBalance
          LatestBalanceUSD
        }
      }
    }
    ```
  </Tab>

  <Tab title="第 2 页">
    ```graphql theme={null}
    query {
      Solana {
        TokenHolders(
          tokenAddress: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
          orderBy: {descending: LatestBalanceUSD}
          limit: { count: 20, offset: 20 }
        ) {
          Holder { Address }
          LatestBalance
          LatestBalanceUSD
        }
      }
    }
    ```
  </Tab>
</Tabs>

### 分页建议

<AccordionGroup>
  <Accordion title="分页务必配合 orderBy">
    没有稳定排序时，行间顺序可能在翻页时变化。请始终将 `limit` 与能产生确定顺序的 `orderBy` 一起使用。
  </Accordion>

  <Accordion title="避免过大 offset">
    很大的 `offset`（例如 50,000+）可能拖慢查询，因为数据库需扫描并跳过行。对超大结果集，优先用 `where` 收窄查询，而非深度 offset 翻页。
  </Accordion>

  <Accordion title="用 count 判断是否到底">
    若某页返回行数少于请求的 `count`，说明已到达结果末尾。也可事先用 `count` 指标字段获取总行数。
  </Accordion>
</AccordionGroup>

***

## 实用示例

### 最新大额成交

获取 Solana 上最近 10 笔买入名义价值超过 10,000 美元的 DEX 成交：

```graphql theme={null}
query {
  Solana {
    DEXTrades(
      where: {
        Trade: { Buy: { PriceInUSD: { gt: 10000 } } }
      }
      orderBy: {descending: Block_Time}
      limit: { count: 10 }
    ) {
      Block { Time }
      Trade {
        Buy {
          Currency { MintAddress }
          Amount
          PriceInUSD
        }
        Dex { ProtocolName }
      }
    }
  }
}
```

### OHLC K 线——最近 60 分钟

获取某代币 1 分钟 K 线，按时间正序：

```graphql theme={null}
query {
  Trading {
    Pairs(
      where: {
        Token: { Address: { is: "So11111111111111111111111111111111111111112" } }
        Market: { Network: { is: "sol" } }
        Block: { Time: { after: "2025-03-27T09:00:00Z" } }
      }
      orderBy: {ascending: Block_Time}
      limit: { count: 60 }
    ) {
      Block { Time }
      Price {
        Ohlc { Open High Low Close }
      }
      Volume { Usd }
      Stats { TradeCount }
    }
  }
}
```

### Top 50 代币持有者

按 USD 余额排序取前 50 名持有者：

```graphql theme={null}
query {
  Solana {
    TokenHolders(
      tokenAddress: "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"
      orderBy: {descending: LatestBalanceUSD}
      limit: { count: 50 }
    ) {
      Holder { Address }
      LatestBalance
      LatestBalanceUSD
      FirstSeen
      LastSeen
    }
  }
}
```

***

## 下一步

<CardGroup cols={2}>
  <Card title="筛选" icon="filter" href="/cn/graphql/schema/filtering">
    将排序与筛选结合，构建精确的分析查询。
  </Card>

  <Card title="指标与聚合" icon="chart-simple" href="/cn/graphql/schema/metrics-aggregation">
    使用 count、sum、avg、min、max、uniq 对已排序数据聚合。
  </Card>
</CardGroup>
