【发布时间】:2019-03-18 12:52:33
【问题描述】:
如果这个问题之前已经回答过,我很抱歉,但我找不到它。也许是我的错误关键字。
我有这张桌子:
CREATE TABLE test1
(
Employee VARCHAR(10),
Band VARCHAR(10),
StartDate DATE,
EndDate DATE
)
INSERT INTO test1
VALUES ('Emp1', 'Band1', '2009-01-01', '2010-12-31'),
('Emp1', 'Band1', '2011-01-01', '2012-12-31'),
('Emp1', 'Band1', '2013-01-01', '2013-08-31'),
('Emp1', 'Band2', '2013-09-01', '2013-12-31'),
('Emp1', 'Band2', '2014-01-01', '2014-06-30'),
('Emp1', 'Band1', '2014-07-01', '2014-12-31'),
('Emp1', 'Band1', '2015-01-01', '2018-08-31'),
('Emp2', 'Band1', '2012-01-01', '2014-12-31'),
('Emp2', 'Band1', '2015-01-01', '2018-03-31')
此表中的结果:
Employee Band StartDate EndDate
----------------------------------------
Emp1 Band1 2009-01-01 2010-12-31
Emp1 Band1 2011-01-01 2012-12-31
Emp1 Band1 2013-01-01 2013-08-31
Emp1 Band2 2013-09-01 2013-12-31
Emp1 Band2 2014-01-01 2014-06-30
Emp1 Band1 2014-07-01 2014-12-31
Emp1 Band1 2015-01-01 2018-08-31
Emp2 Band1 2012-01-01 2014-12-31
Emp2 Band1 2015-01-01 2018-03-31
我要创建的是一个结果表,将每个employee 与band 和最小start date 和最大end date 分组,但是当一个中间记录(band) 存在于类似band 之间的中间,end date 应该被封顶并且类似band 中下一组的start date 应该再次重置。
Employee Band StartDate EndDate
----------------------------------------
Emp1 Band1 2009-01-01 2013-08-31
Emp1 Band2 2013-09-01 2014-06-30
Emp1 Band1 2014-07-01 2018-08-31
Emp2 Band1 2012-01-01 2018-03-31
我已经尝试 CTE 来获取每个波段的最大值和最小值,并将其与原始表进行比较,但我仍然失败了。我也尝试过使用领先和滞后,但仍然失败。
很高兴
假设第二条记录的EndDate是2012-02-01,我更喜欢结果仍然是第一个Band1组的一条记录。
Employee Band StartDate EndDate
----------------------------------------
Emp1 Band1 2009-01-01 2013-08-31
结果的每一行仅在 Band 中有所不同,我可以计算出员工在移动到其他波段(不同波段)之前在某个波段停留了多长时间。
但拥有它是件好事。
【问题讨论】:
-
样本数据最好使用DDL + DML。请edit您的问题包括它和您当前的尝试。另外,请用文字解释获得所需结果的逻辑。更多详情,read this.
-
我希望现在更好。
-
好多了。好样的!如果两个记录之间有间隙怎么办?假设第二条记录的开始日期为
2011-02-01,您想要的结果是否应该忽略这个差距,或者它是否应该在数据中包含emp1和band1的两条记录? -
已编辑问题。感谢您指出。我希望结果忽略这个差距仍然为第一组输出一条记录。
标签: sql-server aggregate aggregate-functions