根据时间范围合并行以减少 SQL Server 2012 中的数据冗余



我有以下SQL问题,我实际上正在寻找最有效的方法来做到这一点。假设我有下表:

r|Company - StartPeriod - EndPeriod - NumberOfEmployees - NumberOfMachines ...
1|A - 2014-1-1 - 2014-2-5 - 30 - 1
2|A - 2014-2-6 - 2014-3-7 - 30 - 1
3|A - 2014-3-8 - 2014-4-9 - 31 - 1
4|A - 2014-4-9 - 2014-5-1 - 32 - 1
5|B - 2014-1-2 - 2014-2-1 - 20 - 2
6|B - 2014-2-2 - 2014-3-1 - 20 - 2
7|B - 2014-3-2 - 2014-4-1 - 20 - 2

注意到冗余数据量了吗?这是因为这些公司不时会被抽样,因此这些时期实际上是随机的。

现在的问题是,当且仅当变量 NumberOfEmployees、NumberOfMachines 等相同,但 StartPeriod 和 Endperiod 不同时,如何合并行?当然,我想用最早的开始期替换结束期,用最新的期替换结束期。

r 只是一个指标,而不是数据库中的变量。在这种情况下,1 和 2 将被合并,但 3,4 将被保留,因为它具有不同的值(即它有 31 名员工而不是 30 名员工)。

在我看来,这是一个

如此困难的问题,我甚至不确定SQL是否可以做到这一点。

生成的输出将是:

r|Company - StartPeriod - EndPeriod - NumberOfEmployees - NumberOfMachines ...
1|A - 2014-1-1 - 2014-3-7 - 30 - 1
2|A - 2014-3-8 - 2014-4-9 - 31 - 1
3|A - 2014-4-9 - 2014-5-1 - 32 - 1
4|B - 2014-1-2 - 2014-4-1 - 20 - 2

谢谢你的一切!

你可以只使用group by

select company, min(startperiod) as startperiod, max(endperiod) as endperiod,
       numberofemployees, numberofmachines . .
from table t
group by company, numberofemployees, numberofmachines;

如果这不能解决问题,请编辑问题并提供有关合并行所需的其他逻辑的更多信息。

您可以使用"孤岛和间隙"策略:

select r, company, min(startperiod), max(EndPeriod)
     , NumberOfEmployees, NumberOfMachines, ..., grp
from (
    select r, company, startperiod, EndPeriod, ...
         , row_number() over (order by r)
         - row_number() over (partition by company, 
                                           NumberOfEmployees,
                                           NumberOfMachines, ...  
                              order by r) as grp
    from T
)
group by r, company, NumberOfEmployees, NumberOfMachines, ..., grp

相关内容

最新更新