sql – 从非规范化表中规范化数据
发布时间:2020-05-24 03:47:10 所属栏目:MsSql 来源:互联网
导读:我的表格中有数据 RepID|Role|Status|StartDate |EndDate |-----|----|------|----------|----------| 10001|R1 |Active|01/01/2015|01/31/2015|-----|----|------|----------|----------|10001|R1 |Leavee|02/01/2
|
我的表格中有数据 RepID|Role|Status|StartDate |EndDate | -----|----|------|----------|----------| 10001|R1 |Active|01/01/2015|01/31/2015| -----|----|------|----------|----------| 10001|R1 |Leavee|02/01/2015|02/12/2015| -----|----|------|----------|----------| 10001|R1 |Active|02/13/2015|02/28/2015| -----|----|------|----------|----------| 10001|R2 |Active|03/01/2015|03/18/2015| -----|----|------|----------|----------| 10001|R2 |Leave |03/19/2015|04/10/2015| -----|----|------|----------|----------| 10001|R2 |Active|04/11/2015|05/10/2015| -----|----|------|----------|----------| 10001|R1 |Active|05/11/2015|06/13/2015| -----|----|------|----------|----------| 10001|R1 |Leave |06/14/2015|12/31/9998| -----|----|------|----------|----------| 我正在寻找这样的输出, RepID|Role|StartDate |EndDate | -----|----|----------|----------| 10001|R1 |01/01/2015|02/28/2015| -----|----|----------|----------| 10001|R2 |03/01/2015|05/10/2015| -----|----|----------|----------| 10001|R1 |05/11/2015|12/31/9998| -----|----|----------|----------| 只要角色发生变化,我就需要捕获start和EndDate.我尝试了不同的方法,但无法获得输出. 任何帮助表示赞赏. 下面是我试过的SQL,但它没有帮助, SELECT T1.RepID,T1.Role,Min(T1.StartDate) AS StartDate,Max(T1.EndDate) AS EndDate
FROM
(SELECT rD1.RepID,rD1.Role,rD1.StartDate,rD1.EndDate
FROM repDetails rD1
INNER JOIN repDetails rD2
ON rD2.RepID = rD1.RepID AND rD2.StartDate = DateAdd (Day,1,rD1.EndDate) AND (rD2.Role = rD1.Role OR (rD2.Role IS NULL AND rD1.Role IS NULL) OR (rD2.Role = '' AND rD1.Role = ''))
UNION
SELECT rD2.RepID,rD2.Role,rD2.StartDate,rD2.EndDate
FROM repDetails rD1
INNER JOIN repDetails rD2
ON rD2.RepID = rD1.RepID AND rD2.StartDate = DateAdd (Day,rD1.EndDate) AND (rD2.Role = rD1.Role OR (rD2.Role IS NULL AND rD1.Role IS NULL) OR (rD2.Role = '' AND rD1.Role = ''))
) T1
GROUP BY T1.RepID,T1.Role
UNION
SELECT EP.RepID,EP.Role AS DataValue,EP.StartDate,EP.EndDate
FROM repDetails EP
LEFT OUTER JOIN
(SELECT rD1.RepID,rD1.EndDate) AND (rD2.Role = rD1.Role OR (rD2.Role IS NULL AND rD1.Role IS NULL) OR (rD2.Role = '' AND rD1.Role = ''))
) T1
ON EP.RepID = T1.RepID AND EP.StartDate = T1.StartDate
WHERE T1.RepID IS NULL
解决方法这里的关键是识别连续的行,直到角色发生变化.这可以通过使用前导函数比较下一行的角色和一些额外的逻辑来将所有先前的行分类到同一组中来完成.将它们分组后,您只需使用min和max来获取开始和结束日期. with groups as (
select x.*,case when grp = 1 then 0 else 1 end + sum(grp) over(partition by repid order by startdate) grps
from (select t.*,case when lead(role) over(partition by repid order by startdate) = role then 0 else 1 end grp
from t) x
)
select distinct repid,role,min(startdate) over(partition by repid,grps) startdt,max(enddate) over(partition by repid,grps) enddt
from groups
order by 1,3
(编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
