Postgresql11 间隔时间计算sql之优化

  • Server Type    : PostgreSQL
  • Server Version : 11
  • 情景:
    • 计算线路车辆早7:00时开始车辆运行开始平均时间间隔。
  • 思路:
    • a.rnb.rn
        
       line1
      line1line2
      line2line3
      line3line4
      line4line5
      line5 
        
      a.rn = b.rn -1
  • 解决办法:
    • with a as (
      SELECT ds,line,row_number() over (partition by ds,line order by start_time) as lable
      from bus_run_record
      where ds ='2020-04-17' and date_part('hour',start_time) = 7 
      )
      ,c as (SELECT a.ds,b.line,
      date_part('epoch',(b.start_time-a.start_time)/60):: numeric(6,2) as start_div
      from a left join a b
      on a.ds=b.ds and a.line=b.line and a.lable=b.lable-1
      where (b.ds-a.ds) is  not NULL
      )
      
      select ds,line, avg(start_div):: numeric(6,2) as start_div
      from c
      group by ds,line
      order by ds,line

       

  • 优化措施

    • with a as(
      select ds,line,start_time,
      date_part('epoch',(lead(start_time) over (partition by ds,line order by start_time) - start_time)/60) as start_div
      from bus_run_record
      where ds ='2020-04-17' and date_part('hour',start_time) = 7 
      )
      
      select ds,line, avg(start_div):: numeric(6,2) as start_div
      from a
      where start_div is not null 
      group by ds,line
      order by ds,line

       

    •  Lead分析函数可以在同一次查询中取出同一字段的前N行的数据(Lag)和后N行的数据(Lead)作为独立的列。
      这种操作可以代替表的join自联接,并且LAG和LEAD有更高的效率.

    • 经过实际优化测试,比一开始自联结写法快0.5倍

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值