如何处理SQL中的重复记录?
How to handle repeated records in SQL?
我有一个简单的数据集如下:
Employee Data
每当部门 ID 更改或状态代码更改时,我需要员工的最短开始日期和最长结束日期。
所以我为最小开始日期写了这个公式-
select emp id, dept id, status code , min(start date) from tablename group by emp id, dept id, status code.
我得到以下结果:
Result
我的结果中缺少突出显示的日期,因为重复了部门 ID 和状态代码。由于我采用的是最短开始日期,因此不考虑这些记录。
同样,我也需要获取最大结束日期。
如有任何帮助,我们将不胜感激。
谢谢。
更新 - 添加示例数据和预期输出。
创建 table 名员工(
emp_id 整数,start_date 日期,end_date 日期,dept_id 整数,status_code varchar(100));
插入员工价值观
('2233','1/1/2020','1/25/2020','123','Active'),
('2233','1/25/2020','2/15/2020','123','Active'),
('2233','2/15/2020','3/29/2020','123','Active'),
('2233','3/29/2020','4/11/2020','456','Active'),
('2233','4/11/2020','5/5/2020','456','Leave'),
('2233','5/5/2020','6/17/2020','456','Active'),
('2233','6/17/2020','7/22/2020','456','Active'),
('2233','7/22/2020','8/19/2020','789','Active'),
('2233','8/19/2020','9/30/2020','789','Terminated'),
('2244','1/10/2020','1/25/2020','122','Active'),
('2244','1/25/2020','2/19/2020','122','Leave'),
('2244','2/19/2020','3/31/2020','122','Active'),
('2244','3/31/2020','4/11/2020','322','Active'),
('2244','4/11/2020','5/5/2020','322','Active'),
('2244','5/5/2020','6/17/2020','322','Active'),
('2244','6/17/2020','7/22/2020','322','Active'),
('2244','7/22/2020','8/24/2020','422','Active'),
('2244','8/24/2020','9/24/2020','422','Terminated')
预期输出:
expected output
要获得最大结束日期,您可以修改代码如下:
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 服务器上测试过了。结果分享如下。 (请根据您的 table 更改变量名称)
这是孤岛和缺口问题,您可以使用 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
我有一个简单的数据集如下:
Employee Data
每当部门 ID 更改或状态代码更改时,我需要员工的最短开始日期和最长结束日期。
所以我为最小开始日期写了这个公式- select emp id, dept id, status code , min(start date) from tablename group by emp id, dept id, status code.
我得到以下结果: Result
我的结果中缺少突出显示的日期,因为重复了部门 ID 和状态代码。由于我采用的是最短开始日期,因此不考虑这些记录。
同样,我也需要获取最大结束日期。
如有任何帮助,我们将不胜感激。
谢谢。
更新 - 添加示例数据和预期输出。
创建 table 名员工(
emp_id 整数,start_date 日期,end_date 日期,dept_id 整数,status_code varchar(100));
插入员工价值观
('2233','1/1/2020','1/25/2020','123','Active'),
('2233','1/25/2020','2/15/2020','123','Active'),
('2233','2/15/2020','3/29/2020','123','Active'),
('2233','3/29/2020','4/11/2020','456','Active'),
('2233','4/11/2020','5/5/2020','456','Leave'),
('2233','5/5/2020','6/17/2020','456','Active'),
('2233','6/17/2020','7/22/2020','456','Active'),
('2233','7/22/2020','8/19/2020','789','Active'),
('2233','8/19/2020','9/30/2020','789','Terminated'),
('2244','1/10/2020','1/25/2020','122','Active'),
('2244','1/25/2020','2/19/2020','122','Leave'),
('2244','2/19/2020','3/31/2020','122','Active'),
('2244','3/31/2020','4/11/2020','322','Active'),
('2244','4/11/2020','5/5/2020','322','Active'),
('2244','5/5/2020','6/17/2020','322','Active'),
('2244','6/17/2020','7/22/2020','322','Active'),
('2244','7/22/2020','8/24/2020','422','Active'),
('2244','8/24/2020','9/24/2020','422','Terminated')
预期输出: expected output
要获得最大结束日期,您可以修改代码如下:
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 服务器上测试过了。结果分享如下。 (请根据您的 table 更改变量名称)
这是孤岛和缺口问题,您可以使用 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