基于头记录分组数据

pea*_*dog 5 sql-server t-sql sql-server-2016

我有一个电子表格,我要导入到原始数据库中,一个 SQL Server 2016 数据库。它有所谓的“密码箱格式”的记录,显然是银行使用的。它通常看起来像这样:

Batch1 详细信息
子记录Batch2 的批处理 标题行的
另一个子记录
摘要

我在这里设置了一个小提琴

需要注意的是:

  • 第 1 列表示该行的记录“类型”。它是唯一的“通用”列。
  • 每隔一列本质上会根据记录类型而变化。
  • 将子记录与父记录相关联的唯一原因是它们出现在父记录之后和下一个父记录之前。ID 在行之间不共享。
  • 批次后面有可变数量的子行(不可预测)。

有没有办法查询这个,以便我可以轻松地对例如一批和它的子+页脚记录进行分组?我必须做的一件事是指出页脚记录包含正确的聚合(取自子记录;包括批次的子记录数量,这是我需要验证的一部分)。

mus*_*cio 1

假设输入数据的顺序是这样的,即批处理的开头 ( Column1=1) 始终具有该批处理中最少的数据RowNumber,您可以执行以下操作,使用RowNumber前面的标头记录中最大的一个来分配伪批处理编号:

select t.*, 
    max(case column1 when 1 then RowNumber end) 
    over(order by rownumber range between unbounded preceding and current row) as batchid
from tbl t  
Run Code Online (Sandbox Code Playgroud)

小提琴

如果将以上内容包装在子选择中并使用伪批次号来分区数据或对数据进行分组,则可以从那里使用聚合或窗口函数来计算聚合:

select 
max(case column1 when 1 then column3 end) as batchid,
sum(case column1 when 2 then some_numeric_column end) as sum_children,
max(case column1 when 8 then column3 end) as footer_value
from (
  select t.*, 
    max(case column1 when 1 then rownumber end) 
    over(order by rownumber range between unbounded preceding and current row) as batchnum
from tbl
) t1
group by batchnum
Run Code Online (Sandbox Code Playgroud)