代码之家  ›  专栏  ›  技术社区  ›  gene

如何根据某个数据的模式对大容量表中的数据进行分组?

  •  1
  • gene  · 技术社区  · 6 年前

    我有一张超过14000行的桌子。从大容量操作插入到表中的数据。

    表如下所示:

    LineNumber Data
    1          100000 BANK       RUNNER222----BANK FILE                  PAGE 1
    2          OTHER RELATED DATA----------------------------------
    3          OTHER RELATED DATA----------------------------------
    4          OTHER RELATED DATA----------------------------------
    5          100000 BANK       RUNNER222----BANK FILE                  PAGE 2
    6          OTHER RELATED DATA----------------------------------
    7          OTHER RELATED DATA----------------------------------
    8          OTHER RELATED DATA----------------------------------
    9          OTHER RELATED DATA----------------------------------
    10         100000 BANK       RUNNER222----BANK FILE                  PAGE 3
    11         OTHER RELATED DATA----------------------------------
    12         OTHER RELATED DATA----------------------------------
    13         OTHER RELATED DATA----------------------------------
    14         OTHER RELATED DATA----------------------------------
    15         TOTAL                                         100.00 
    16         111111 BANK       RUNNER222----BANK FILE                  PAGE 1
    17         OTHER RELATED DATA----------------------------------
    18         OTHER RELATED DATA----------------------------------
    19         OTHER RELATED DATA----------------------------------
    20         OTHER RELATED DATA----------------------------------
    21         111111 BANK       RUNNER222----BANK FILE                  PAGE 2
    22         OTHER RELATED DATA----------------------------------
    23         OTHER RELATED DATA----------------------------------
    24         OTHER RELATED DATA----------------------------------
    25         OTHER RELATED DATA----------------------------------
    26         TOTAL                                         100.00 
    27         222222 BANK       RUNNER222----BANK FILE                  PAGE 1
    28         OTHER RELATED DATA----------------------------------
    29         OTHER RELATED DATA----------------------------------
    30         OTHER RELATED DATA----------------------------------
    31         OTHER RELATED DATA---------------------------------- 
    32         222222 BANK       RUNNER222----BANK FILE                  PAGE 2
    33         OTHER RELATED DATA----------------------------------
    34         OTHER RELATED DATA----------------------------------
    35         OTHER RELATED DATA----------------------------------
    36         OTHER RELATED DATA----------------------------------   
    37         TOTAL                                         100.00  
    
    and etc...
    

    我想基于上面的数据创建一个临时表,每个文件只包含3行。 该表将有3列,start、end、bankid

    像这样的:

    Start    End    Data
    1        15     100000 BANK       RUNNER222----BANK FILE                  PAGE 1
    16       26     111111 BANK       RUNNER222----BANK FILE                  PAGE 1
    27       37     222222 BANK       RUNNER222----BANK FILE                  PAGE 1
    

    我有以下逻辑来创建和填充表:

    if OBJECT_ID('tempdb..#MyTempTable') is not null drop table #MyTempTable
    create table #MyTempTable(
        Start int,
        End int,
        [Data] nvarchar(max)
    )
    
    insert into #MyTempTable(Start, End, [Data])
    select 
        min(LineNumber),
        max(LineNumber),
        [Data]  
    from Bulk_Table where [Data] like '%RUNNER222----BANK FILE%'
    group by [Data]
    

    但是,当我从表中选择时,我有以下选项:

    Start    End     Data
    1        1       100000 BANK       RUNNER222----BANK FILE                  PAGE 1
    15       15      100000 BANK       RUNNER222----BANK FILE                  PAGE 2
    16       16      111111 BANK       RUNNER222----BANK FILE                  PAGE 3
    26       26      111111 BANK       RUNNER222----BANK FILE                  PAGE 1
    36       36      222222 BANK       RUNNER222----BANK FILE                  PAGE 2
    

    基本上,我所寻找的是临时表具有与银行数量相同的记录量,在这种情况下是3,并且每一行都有批开始、结束和哪一行是批处理。

    我做错什么了? 我通过数据分组,包含银行并获得行号的最小和最大值。

    这里正确的方法是什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Jacob H    6 年前

    从评论部分转到此处的答案。问题是 [Data] 列包含一个页码,该页码为每个“bank runner”行生成唯一的组。我拙劣的解决办法是简单地截断 Group By 使用 Left ,从而切断唯一的页码。

    这也可以用许多其他的方法来完成,但是这是一个快速的解决方案来改变原来的查询:

    insert into #MyTempTable(Start, End, [Data])
    select 
        min(LineNumber),
        max(LineNumber),
        [Data]  
    from Bulk_Table 
    where [Data] like '%RUNNER222----BANK FILE%'
    group by [Data]
    

    对此:

    insert into #MyTempTable([Start], [End], [Data])
    select 
        min(LineNumber),
        max(LineNumber),
        left([Data], 11) as FirstElevenCharactersOfData
    from Bulk_Table 
    where [Data] like '%RUNNER222----BANK FILE%'
    group by left([Data], 11)
    

    仅按前几个字符分组允许足够的唯一信息对单个银行值进行分组,而不允许对页码进行分组。

    Rextester示例: http://rextester.com/BHA35584