3.2 有序过滤

## 3.2.1 集文件
SQL

SELECT count (DISTINCT CustomerID) iNum,count(1) Num,EmployeeID,EmployeeName
FROM Orders
WHERE OrderDate>='2022-03-15' and OrderDate<='2022-06-16' and Amount>1000
GROUP BY EmployeeID,EmployeeName
ORDER BY EmployeeID

SPL

A
1 >st=date(“2022-03-15”), et=date(“2022-06-16”), start=days@o(st), end=days@o(et)
2 =file(“Orders_Time.btx”).iselect@br(start:end,OrderDate; EmployeeID, EmployeeName, CustomerID,Amount).select(Amount>1000).groups(EmployeeID; EmployeeName, count(1):Num, icount(CustomerID):iNum)

A2 iselect 表示从对 OrderDate 有序的文件读出 OrderDate 在 [start,end] 区间的记录构成游标,此时区间是闭区间,@r 选项表示 OrderDate 取值不唯一。
iselect 不能同时使用并行选项,在单任务场景时,如果选出结果集较大,不一定会比采用并行后的全遍历更快。但在多任务场景时,通常也不能使用并行(多 CPU 要用于处理并发),iselect 就会有较大优势。
由于数据是按时间有序的,所以 Amount>1000 不能写到 iselect 里面,只能在外面再用 select 过滤。由于 iselect 结果集已经比较小了,所以对性能的影响不大。

3.2.2 组表

SQL

SELECT count (DISTINCT CustomerID) iNum,count(1) Num,EmployeeID,EmployeeName
FROM Orders
WHERE OrderDate>='2022-03-15' and OrderDate<='2022-06-16' and Amount>1000
GROUP BY EmployeeID,EmployeeName
ORDER BY EmployeeID

SPL

A
1 >st=date(“2022-03-15”), et=date(“2022-06-16”), start=days@o(st), end=days@o(et)
2 =file(“Orders_Time.ctx”).open().cursor@m(OrderDate,CustomerID,EmployeeID,EmployeeName;OrderDate>=start && OrderDate<=end && Amount>1000)
3 =A2.groups(EmployeeID; EmployeeName, count(1):Num, icount(CustomerID):iNum)

A2 从组表文件中读取满足时间段的数据,@m 表示并行
过滤时把条件写到 cursor()里面,将会自动处理维字段实施跳块动作,不满足条件的数据块会被直接跳过。如果写成 cursor().select(…),则不会实施跳块动作,所有数据块都会被扫描。
和前述的集文件不同,组表则可以把 Amount>1000 写到 cursor 里面,和时间的过滤条件写到一起,在实施完跳块动作后,遍历块内数据时自动会识别并执行过滤。

以下是广告时间

对润乾产品感兴趣的小伙伴,一定要知道软件还能这样卖哟性价比还不过瘾? 欢迎加入好多乾计划。
这里可以低价购买软件产品,让已经亲民的价格更加便宜!
这里可以销售产品获取佣金,赚满钱包成为土豪不再是梦!
这里还可以推荐分享抢红包,每次都是好几块钱的巨款哟!
来吧,现在就加入,拿起手机扫码,开始乾包之旅



嗯,还不太了解好多乾?
猛戳这里
玩转好多乾