开发者社区> 问答> 正文

SQL:从3条记录中提取数据并合并为一条

我有一张表,每天有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中的日期,因此返回了所有日期中找到的最大时间,这不是我所需要的。

任何清理这种混乱的帮助都将非常棒!

展开
收起
Puppet 2020-01-03 11:08:47 666 0
1 条回答
写回答
取消 提交回答
  • 您可以使用条件聚合:

    
    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;
    
    2020-01-03 11:09:07
    赞同 展开评论 打赏
问答分类:
SQL
问答地址:
问答排行榜
最热
最新

相关电子书

更多
SQL Server 2017 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载