跳转到主要内容

09 · 排序与 Top-N

场景

按金额降序显示续约金额前 10 名。或者多键排序:先按区域(字母升序),再按金额(降序)。

@sort

{{ @sort [续约金额] desc }}
{{ [客户] }} | {{ [续约金额] }}

方向取值 asc(默认)或 desc@sort稳定排序——排序键相同的行保持其原始(首次出现)顺序。

多键排序

{{ @sort [区域] asc }}
{{ @sort [续约金额] desc }}
{{ [客户] }} | {{ [区域] }} | {{ [续约金额] }}

第一个 @sort主键;后续的 @sort 是 tiebreaker(这与 Excel/SQL 的惯例一致)。上面的例子:行先按区域字母升序分组,每个区域内再按续约金额降序。

@top

{{ @sort [续约金额] desc }}
{{ @top 10 }}
{{ [客户] }} | {{ [续约金额] }}

@top N 在所有过滤、排序之后保留前 N 行。把 @top 放在 @sort 之后——先排序,再取前 N。

如果 N 超过可用行数,@top 不起作用(返回全部行)。负数或 0 会得到空数据块。

@filter 组合

{{ @filter [续约金额] > 1000 }}
{{ @sort [续约金额] desc }}
{{ @top 5 }}
{{ [客户] }} | {{ [续约金额] }}

顺序:filter → sort → top。多个 @filter 以 AND 组合(ADR-0029 相关;列表过滤参考 Recipe 05)。

比较语义

@sort 使用 XTL 的标准比较:

  • 数字或数字形字符串:按数值比较。
  • 布尔值:false < true
  • 日期:按时间戳比较。
  • 其他:按标准字符串形式的 Unicode 码点顺序。不应用本地化排序。 "Z" < "a"(ASCII 中大写 < 小写)。

如果你的操作员需要按本地化顺序排列,请在上游预先排好,或加一列排序键。

备注

  • 稳定排序意味着键相同的行保持插入顺序——这在多个 @sort 作为 tiebreaker 时至关重要。
  • "@sort 之后跟 @top" 是标准的"Top-N"模式。单独的 @top(不带 sort)会按源顺序返回前 N 行。
  • 规范参考:spec/language.md "Sort" 与 "Top";ADR-0016。