我有以下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 etcetera相同但StartPeriod和Endperiod不同时,如何合并行?当然我想用最早的那个替换开始时期,用最新的那个替换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
感谢您的一切!
答案 0 :(得分:1)
您可以使用group by
:
select company, min(startperiod) as startperiod, max(endperiod) as endperiod,
numberofemployees, numberofmachines . .
from table t
group by company, numberofemployees, numberofmachines;
如果这不能解决问题,请编辑问题并提供有关合并行所需的其他逻辑的更多信息。
答案 1 :(得分:0)
你可以使用“岛屿和差距”战略:
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