SQL:在 CsvPath 中使用 GROUP BY

发布: (2025年12月4日 GMT+8 09:28)
4 min read
原文: Dev.to

Source: Dev.to

介绍

让我们看看如何在 CsvPath 框架 的表格数据验证语言中创建一个简单的 GROUP BY 报告。在所有示例中,这个是最容易的!

SQL GROUP BY 概述

GROUP BY 查询会选择行并根据一个或多个列进行分组。典型的例子是:

SELECT  
  dept, 
  role, 
  SUM(salary) total_salary
FROM    employee
GROUP BY dept, role

该查询会产生一个包含三列的结果集:deptrole 的唯一组合,以及每个组合的工资总和。

设置 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 变量的文本表格。

帮助窗口截图

FlightPath Data 帮助窗口

生成的表格

使用 CsvPath 对 CSV 文件进行验证的报告

只需要两行 CsvPath 代码就能完成这个简单的聚合。

扩展到两列(在多个字段上 GROUP BY

为了模拟原始 SQL 示例中同时按 deptrole 分组的情况,我们创建一个复合键:

~ 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 调用打印聚合结果。

完整示例截图

完整的 CsvPath 示例用于验证 CSV 文件

生成的表格

CsvPath 对 CSV 文件输出的验证报告

打印出的表格便于人工阅读验证,而底层的 vars.json 文件则包含结构化数据,可用于自动化处理。

自动化与报告

CsvPath 旨在实现无人值守的自动化。验证结果可以捕获到:

  • vars.json – 保存诸如聚合表之类的变量。
  • errors.json – 收集内置的验证错误。可以使用 error() 函数生成自定义错误。

CsvPath 还提供了一个高级打印子系统,能够将输出定向到多个流,从而让你能够为不同的受众分离信息性消息、错误报告以及其他运行特定的数据。


本文完。

Back to Blog

相关文章

阅读更多 »

创建12

用于DBVisualizer的T-SQL脚本,统计过去45天内添加的行数

创建10

SQL 查询:从 `user_tab_columns` 表中查找列名为 **'INTERNTIMESTAMP'** 且数据类型匹配 **'TIME…'** 的表名,然后获取这些表在最近 45 天内的行数,例如: ```sql SELECT utc.table_name, xt.rows_last_45_days FROM ( SELECT table_name FROM user_tab_columns WHERE UPPER(column_name) = 'INTERNTIMESTAMP' AND data_type LIKE 'TIME%' ) utc JOIN ( -- 这里假设有一个查询返回每个表最近45天的行数 SELECT table_name, rows_last_45_days FROM some_other_source ) xt ON utc.table_name = xt.table_name; ```

步骤2

查询过滤器https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2...