【问题标题】:Create dynamic column创建动态列
【发布时间】:2019-12-22 05:32:42
【问题描述】:

我的表有这个数据

START_DATE | STOP_DATE |样品日期 | SAMPLE_VALUE :-------------------- | :-------------------- | :--------------------- | ------------: 2019 年 11 月 11 日上午 8:00:00 | 2019 年 11 月 11 日上午 9:00:00 | 2019 年 11 月 11 日上午 8:10:00 | 10 2019 年 11 月 11 日上午 8:00:00 | 2019 年 11 月 11 日上午 9:00:00 | 2019 年 11 月 11 日上午 8:14:00 | 20 2019 年 11 月 11 日上午 8:00:00 | 2019 年 11 月 11 日上午 9:00:00 | 2019 年 11 月 11 日上午 8:20:00 | 15 2019 年 11 月 11 日上午 8:00:00 | 2019 年 11 月 11 日上午 9:00:00 | 2019 年 11 月 11 日上午 8:40:00 | 10 2019 年 11 月 11 日上午 8:00:00 | 2019 年 11 月 11 日上午 9:00:00 | 2019 年 11 月 11 日上午 8:50:00 | 21 2019 年 11 月 11 日上午 8:00:00 | 2019 年 11 月 11 日上午 9:00:00 | 2019 年 11 月 11 日上午 8:55:00 | 20

我想写查询返回这个结果

START_DATE | STOP_DATE |第 1 部分 |第 2 部分 |第 3 部分 |第 4 部分 :-------------------- | :-------------------- | ------|------|------|------ 2019 年 11 月 11 日上午 8:00:00 | 2019 年 11 月 11 日上午 9:00:00 | 20 |15 |10 |20

我希望开始日期停止日期拆分为 4 部分 [8:00-8:15,8:15-8:30,8:30-8:45,8:45-09:00] 并设置最后样本值到相应的列。

请帮帮我

小提琴here

【问题讨论】:

    标签: sql oracle pivot


    【解决方案1】:

    一种选择是使用connect by level < 语法并在后续步骤中应用row_number() 分析函数:

    with t as
    (
     select start_date + 
            level * ( stop_date - start_date ) 
                   /( ( extract(hour from (stop_date - start_date))*60+
                          extract(minute from (stop_date - start_date)) )
                         / 15  )  as split_date, 
            start_date, stop_date, sample_date, sample_value, level as lvl
       from heats
    connect by level <= ( extract(hour from (stop_date - start_date))*60+
                          extract(minute from (stop_date - start_date)) )
                         / 15   
       and prior sys_guid() is not null
       and prior sample_date = sample_date
    ), t2 as
    (
    select row_number() over (partition by split_date order by sample_date desc) as rn,
           t.*
      from t     
     where sample_date < split_date   
    )
    select start_date, stop_date, 
           max( case when lvl = 1 then sample_value end ) as part1,
           max( case when lvl = 2 then sample_value end ) as part2,
           max( case when lvl = 3 then sample_value end ) as part3,
           max( case when lvl = 4 then sample_value end ) as part4
      from t2
     where rn = 1 
     group by start_date, stop_date
     order by rn desc;
    

    Demo

    【讨论】:

    • 不客气@ashkufaraz,这个更新的将更加动态(取决于 15 分钟)
    【解决方案2】:
    select start_date, stop_date
         , max(case min15 when 0 then sample_value end) as part1
         , max(case min15 when 15 then sample_value end) as part2
         , max(case min15 when 30 then sample_value end) as part3
         , max(case min15 when 45 then sample_value end) as part4 
    from (
    select start_date, stop_date, sample_value, min15, row_number() over (partition by min15 order by sample_date desc) as rn
    from (
        select h.*, trunc(to_char (sample_date,'MI') / 15) * 15 as min15 
        from heats h
    ) T
    ) U
    where rn = 1
    group by start_date, stop_date;
    

    【讨论】:

      猜你喜欢
      • 2020-04-09
      • 2012-09-20
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2018-03-17
      • 1970-01-01
      • 2018-10-14
      相关资源
      最近更新 更多