0

我有一个简单的数据集,如下所示:

员工数据

每当部门 ID 更改或状态代码更改时,我都需要员工的最短开始日期和最长结束日期。

所以我为最小开始日期编写了这个公式 - 从表名组中选择 emp id、dept id、status code、min(start date) by emp id、dept id、status code。

我得到了以下结果: 结果

我的结果中缺少突出显示的日期,因为部门 ID 和状态代码重复了。由于我正在考虑最低开始日期,因此不考虑这些记录。

同样,我也需要获得最大结束日期。

任何帮助将不胜感激。

谢谢。

更新 - 添加示例数据和预期输出。

创建表员工(

emp_id int、start_date 日期、end_date 日期、dept_id int、status_code varchar(100));

插入员工价值观

('2233','1/1/2020','1/25/2020','123','活动'),

('2233','1/25/2020','2/15/2020','123','活动'),

('2233','2/15/2020','3/29/2020','123','活动'),

('2233','3/29/2020','4/11/2020','456','活动'),

('2233','4/11/2020','5/5/2020','456','离开'),

('2233','5/5/2020','6/17/2020','456','活动'),

('2233','6/17/2020','7/22/2020','456','活动'),

('2233','7/22/2020','8/19/2020','789','活动'),

('2233','8/19/2020','9/30/2020','789','终止'),

('2244','1/10/2020','1/25/2020','122','活动'),

('2244','1/25/2020','2/19/2020','122','离开'),

('2244','2/19/2020','3/31/2020','122','活动'),

('2244','3/31/2020','4/11/2020','322','活动'),

('2244','4/11/2020','5/5/2020','322','活动'),

('2244','5/5/2020','6/17/2020','322','活动'),

('2244','6/17/2020','7/22/2020','322','活动'),

('2244','7/22/2020','8/24/2020','422','活动'),

('2244','8/24/2020','9/24/2020','422','终止')

预期产出: 预期产出

4

2 回答 2

0

要获得最大结束日期,您可以修改代码如下:

select emp id, dept id, status code , min(start date) max(end date) from tablename 
group by emp id, dept id, status code

如果我的理解正确,您希望员工明智的部门明智的状态明智的最短开始日期和最长开始日期。但是,如果任何条件不连续重复,而是在另一个条件之后重复,则将分别考虑该条件以计算最小开始日期和最大结束日期。

请在 csv 或 excel 中共享示例数据列表,以便我可以复制它进行测试。而您正在使用Teradata数据库。

您可以通过以下查询实现您的目标:

select employeeid,deptid,status,min(strtdate) MinimumStartdate,max(enddate) MaximumStartdate from 
(
select *,(row_number()over(order by EMPLOYEEID,STRTDATE) -ROW_NUMBER()over(partition by employeeid,deptid,status order by employeeid))grp
from emp) t
group by employeeid,deptid,status,grp

我已经在 sql server 中测试过了。结果分享如下。(请根据您的表格更改变量名称)

在此处输入图像描述

于 2021-01-16T08:36:43.573 回答
0

analytical function这是孤岛和间隙问题,您可以使用以下方法来实现安全的结果group by

select emp_id, dept_id, status_code , 
       min(start_date),
       Max(end_date)
From (select t.*,
             Row_number() over (partition by emp_id order by start_date) as rn,
             Row_number() over (partition by emp_id, dept_id, status_code order by start_date) as rn_chng
  from tablename t) t
group by emp_id, dept_id, status_code, rn- rn_chng
于 2021-01-16T08:45:38.757 回答