有一张就业表:
CREATE TABLE #Employment (EmployeeName VARCHAR(100), EmploymentStart DATETIME, EmploymentEnd DATETIME)
INSERT INTO #Employment VALUES ('John','2013-08-01','2013-08-07')
INSERT INTO #Employment VALUES ('John','2013-09-08','2014-05-30')
INSERT INTO #Employment VALUES ('John','2014-05-31','2014-09-29')
INSERT INTO #Employment VALUES ('John','2014-09-30','2015-09-17')
INSERT INTO #Employment VALUES ('John','2015-09-18','2015-10-28')
INSERT INTO #Employment VALUES ('John','2015-11-29','2015-12-15')
INSERT INTO #Employment VALUES ('Kelly','2014-07-19','2014-12-30')
INSERT INTO #Employment VALUES ('Kelly','2014-12-31','2015-03-22')
INSERT INTO #Employment VALUES ('Kelly','2015-04-02','2015-09-18')我需要选择在两个申报日期之间的雇员(连同每一份就业记录):
或
因为一名员工可以拥有符合这两种条件的记录,所以我需要为每个选定的记录分配一个SetId,并按条件拆分记录。
宣布日期:
DECLARE @Date_1 DATETIME = '2014-09-14', @Date_2 DATETIME = '2014-09-21'应该回来
SetId; EmployeeName; EmploymentStart; EmploymentEnd
1; John; 2013-09-08; 2014-05-30 -- Condition 2 fulfilled
1; John; 2014-05-31; 2014-09-29 -- Condition 2 fulfilled和
DECLARE @Date_1 DATETIME = '2015-09-15', @Date_2 DATETIME = '2015-09-21'应该回来
SetId; EmployeeName; EmploymentStart; EmploymentEnd
1;John;2014-05-31;2014-09-29 -- Condition 2 fulfilled
1;John;2014-09-30,2015-09-17 -- Condition 2 fulfilled
2;John;2015-09-18;2015-10-28 -- Condition 1 fulfilled
3;Kelly;2015-04-02;2015-09-18 -- Condition 1 fulfilled任何帮助都很感激。
你好,普泽梅克
发布于 2015-09-20 19:58:38
对于第二个条件,您可以尝试使用铅和滞后分析语句将每个记录与其下一个记录连接起来,然后过滤所有有1天以上间隔的记录,然后重新计算未插入的开始日期和结束日期,然后检查声明的开始日期是否更小,您的结束日期和声明的结束日期是否大于您的结束日期(如果我理解您想要做的话),您可以在这里阅读关于铅和滞后的内容:http://www.databasejournal.com/features/mssql/lead-and-lag-functions-in-sql-server-2012.html。
第一个条件我不太明白。我想你也可以在那里再用一次,我不明白
发布于 2015-09-20 21:38:02
我建议在返回条件的查询之间使用union all。
假设记录并不复杂--嵌套周期和复杂重叠--那么您可以使用lead()和基本逻辑来识别第一个记录:
select e.*, 'First Condition'
from (select e.*,
lead(EmploymentStart) over (partition by EmployeeName order by EmploymentStart) as next_es
from #Employment e
where EmploymentStart <= @Date_2 and EmploymentEnd >= @Date_1
) t
where next_es > dateadd(day, 1, EmployementEnd);第二个问题是差距和岛屿问题,可以用累积和来解决.在Server 2012+中,这实质上是:
select e.EmployeeName, 'Second Condition'
from (select e.*, sum(PeriodStart) over (partition by EmployeeName order by EmploymentStart) as grp
from (select e.*,
(case when lag(EmployementEnd) over (partition by EmployeeName order by EmploymentStart) < datedd(day, -1, EmployeeStart
then 1 else 0 end) as PeriodStart
from #Employment e
where EmploymentStart <= @Date_2 and EmploymentEnd >= @Date_1
) e
) e
group by EmployeeName, grp
having dateadd(day, min(EmployeeStart), max(EmployeeStart)) >= 365;您可能需要修改此查询以处理跨越指定日期跨度的1年期间。最后一个查询是这些(带有适当列)的联合,它只为第二个雇员选择一行(使用row_number() )。
https://stackoverflow.com/questions/32683504
复制相似问题