sortCol
首发版本:3.00.6
语法
sortCol(expr, [asc=true], [nullsLast])
详情
生成指定空值排序规则的元代码,通常和 sql 函数配合使用。空值排序是指在升序或降序排列数据时,指定空值在结果集中的位置(置于开头或末尾)。
参数
expr STRING 或 CODE 类型,可以是标量或向量。
- 当为 STRING 类型时,指定排序列的名称,比如 “value”。
- 当为 CODE 类型时,指定列的计算表达式,比如 <price + volume>,查询时按计算结果排序。
asc BOOL 标量或向量,指定 expr 中各排序项的排序方向。true 表示升序,false 表示降序。默认为 true。
nullsLast BOOL 标量或向量,指定是否在排序时将空值置于末尾。true 表示置于末尾(nulls last),
false 表示置于开头(nulls first)。默认为空,此时相当于指定为 false。
注:
expr、asc、nullsLast 三者的长度必须相同。
返回值
表示空值排序规则的 CODE 标量或向量。sql 函数中的 csort 和 orderBy
参数可以直接使用该返回值。
例子
例 1:指定单个排序列,在 SQL 查询中将空值置于末尾。
// 创建一张表,其中 value 列包含空值
t = table(1..5 as id, 5 8 NULL 2 NULL as value)
| id | value |
|---|---|
| 1 | 5 |
| 2 | 8 |
| 3 | |
| 4 | 2 |
| 5 |
// 按 value 列对数据进行升序排列,并将 value 列中空值对应的行置于末尾
sql(sqlCol("*"), t, orderBy=sortCol("value", true, true)).eval()
| id | value |
|---|---|
| 4 | 2 |
| 1 | 5 |
| 2 | 8 |
| 3 | |
| 5 |
例 2:指定多个排序列,在 SQL 查询中将一列的空值置于末尾,另一列的空值置于开头。
// 创建一张表,其中 price 列和 seq 列都包含空值
t = table(
[1, 2, 3, 4, 5] as id,
[10, NULL, 10, 20, NULL] as price,
[NULL, 2, 1, 3, 4] as seq
)
| id | price | seq |
|---|---|---|
| 1 | 10 | |
| 2 | 2 | |
| 3 | 10 | 1 |
| 4 | 20 | 3 |
| 5 | 4 |
/*
price:降序排列,空值置于末尾
seq:升序排列,空值置于开头
*/
sql(sqlCol("*"), t,
orderBy=sortCol([`price, `seq],
[false, true],
[true, false])).eval()
| id | price | seq |
|---|---|---|
| 4 | 20 | 3 |
| 1 | 10 | |
| 3 | 10 | 1 |
| 2 | 2 | |
| 5 | 4 |
例 3:在 sql 函数中,将 sortCol 的返回值传给 csort 参数,并结合
limit 子句对组内数据排序。
// 创建一张表,其中每个 sym 分组内的 seq 列包含空值
t = table(
[`A, `A, `A, `B, `B, `B] as sym,
[3, NULL, 1, NULL, 2, 1] as seq,
[30, 20, 10, 50, 40, 60] as value
)
| sym | seq | value |
|---|---|---|
| A | 3 | 30 |
| A | 20 | |
| A | 1 | 10 |
| B | 50 | |
| B | 2 | 40 |
| B | 1 | 60 |
// 生成 csort 使用的排序规则:按 seq 升序排列,并将空值置于末尾
sortRule = sortCol("seq", true, true)
// 在每个 sym 分组内,按 sortRule 排序后取前 2 条记录,排除包含空值的记录
sql(select=sqlCol("*"),
from=t,
groupBy=sqlCol("sym"),
groupFlag=0,
csort=sortRule,
limit=2).eval()
| sym | seq | value |
|---|---|---|
| A | 1 | 10 |
| A | 3 | 30 |
| B | 1 | 60 |
| B | 2 | 40 |
