我有一张表,每天有3条记录,共3个班次。我正在尝试将记录每天合并为一行。
当前数据如下:
ID DayNum Flag SesNum SesType SesStart SesEnd
1 1 Y 1 Reg 06:15 10:15
1 1 Y 2 Brk 10:15 11:15
1 1 Y 3 Reg 11:15 15:15
1 2 Y 1 Reg 05:00 11:00
1 2 Y 2 Brk 11:00 12:00
1 2 Y 3 Reg 12:00 15:00
我需要每天进行三个部分的分析,并将它们组合成一个记录。因此,每个ID中每天都有一行包含三个细分。我希望它看起来像这样:
ID DayNum Flag S1_Type S1_Start S1_End S2_Type S2_Start S2_End S3_Type S3_Start S3_End
1 1 Y Reg 06:15 10:15 Brk 10:15 11:15 Reg 11:15 15:15
我尝试了以下方法,并且几乎可以使用了:
Select *
FROM (
select
a.WorkPatternID,
a.DayNo,
max(a.WorkedFlag) as 'WorkedFlag',
max(a.SessionType) as 'S1_Type',
max(a.SessionStart) as 'S1_Start',
max(a.SessionEnd) as 'S1_End',
max(b.SessionType) as 'S2_Type',
max(b.SessionStart) as 'S2_Start',
max(b.SessionEnd) as 'S2_End',
max(c.SessionType) as 'S3_Type',
max(c.SessionStart) as 'S3_Start',
max(c.SessionEnd) as 'S3_End'
FROM ( Select *
FROM WP_Patterns
WHERE SessionNo = 1 ) a
Inner JOIN ( select *
FROM WP_Patterns
WHERE SessionNo = 2 ) b
ON a.WorkPatternID = b.WorkPatternID
Inner JOIN ( select *
FROM WP_Patterns
WHERE SessionNo = 3 ) c
ON a.WorkPatternID = c.WorkPatternID
GROUP BY a.WorkPatternID, a.DayNo
) t
WHERE WorkedFlag = 'Y'
但是,我认为max函数忽略了S2和S3中的日期,因此返回了所有日期中找到的最大时间,这不是我所需要的。
任何清理这种混乱的帮助都将非常棒!
您可以使用条件聚合:
select id, daynum, max(flag),
max(case when sesnum = 1 then SessionType end) as s1_sessionType,
max(case when sesnum = 1 then SessionStart end) as s1_ SessionStart,
max(case when sesnum = 2 then SessionType end) as s2_sessionType,
max(case when sesnum = 2 then SessionStart end) as s2_ SessionStart,
max(case when sesnum = 3 then SessionType end) as s3_sessionType,
max(case when sesnum = 3 then SessionStart end) as s3_ SessionStart
from WP_Patterns
group by id, daynum;
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。