SQL:在 CsvPath 中使用 GROUP BY
Source: Dev.to
介绍
让我们看看如何在 CsvPath 框架 的表格数据验证语言中创建一个简单的 GROUP BY 报告。在所有示例中,这个是最容易的!
SQL GROUP BY 概述
GROUP BY 查询会选择行并根据一个或多个列进行分组。典型的例子是:
SELECT
dept,
role,
SUM(salary) total_salary
FROM employee
GROUP BY dept, role
该查询会产生一个包含三列的结果集:dept 与 role 的唯一组合,以及每个组合的工资总和。
设置 CsvPath 示例
我们将使用 FlightPath Data 的内置示例。 在典型项目中,FlightPath 会创建一个 examples 文件夹,里面放有实用的示例。 本演示使用 examples/counting/projects.csv 作为数据源,并创建一个新的 CsvPath 文件。
基本脚手架
~ test-data:examples/counting/projects.csv ~
$[*][
]
指令 ~ test-data:... ~ 告诉 FlightPath 要扫描哪个文件(* 表示整个文件)。 在生产环境中,这行会被忽略。
使用单列的简单 GROUP BY
下面的 CsvPath 按机构汇总工作人员工时:
~ test-data:examples/counting/projects.csv ~
$[*][
subtotal.worker_hours(#agency, #13)
last() -> var_table("worker_hours")
]
subtotal.worker_hours(#agency, #13)对标题为#13(即#worker_hours_this_period列)的数值,按每个不同的#agency值进行小计。last()只匹配文件的最后一行。匹配时,->右侧的代码会被执行。var_table("worker_hours")打印worker_hours变量的文本表格。
帮助窗口截图
生成的表格
只需要两行 CsvPath 代码就能完成这个简单的聚合。
扩展到两列(在多个字段上 GROUP BY)
为了模拟原始 SQL 示例中同时按 dept 和 role 分组的情况,我们创建一个复合键:
~ test-data:examples/counting/projects.csv ~
$[*][
@key = concat(#agency, ", ", #neighborhood)
subtotal.Aggregate_hours(@key, #13)
last() -> var_table("Aggregate_hours")
]
@key将#agency与#neighborhood列连接起来,形成每个组的唯一标识符。subtotal.Aggregate_hours(@key, #13)对每个不同的键聚合工时值。- 最后的
var_table调用打印聚合结果。
完整示例截图
生成的表格
打印出的表格便于人工阅读验证,而底层的 vars.json 文件则包含结构化数据,可用于自动化处理。
自动化与报告
CsvPath 旨在实现无人值守的自动化。验证结果可以捕获到:
vars.json– 保存诸如聚合表之类的变量。errors.json– 收集内置的验证错误。可以使用error()函数生成自定义错误。
CsvPath 还提供了一个高级打印子系统,能够将输出定向到多个流,从而让你能够为不同的受众分离信息性消息、错误报告以及其他运行特定的数据。
本文完。



