【问题标题】:How to query with lead() values not in current range如何使用不在当前范围内的铅()值进行查询
【发布时间】:2017-10-23 00:58:42
【问题描述】:

当lead() 值不在当前行的范围内时,我在查询时遇到问题,范围边缘的行返回空lead() 值。

假设我有一个简单的表格来跟踪连续计数器

create table anytable
( wseller integer  NOT NULL,
  wday    date     NOT NULL,
  wshift  smallint NOT NULL,
  wconter numeric(9,1) )

具有以下值

wseller      wday wshift wcounter
      1 2016-11-30     1    100.5
      1 2017-01-03     1    102.5
      1 2017-01-25     2    103.2
      1 2017-02-05     2    106.1
      2 2015-05-05     2    81.1
      2 2017-01-01     1    92.1
      2 2017-01-01     2    93.1
      3 2016-12-01     1    45.2
      3 2017-01-05     1    50.1

想要当年的净单位

wseller       wday wshift units
      1 2017-01-03      1     2
      1 2017-01-25      2   0.7
      1 2017-02-05      2   2.9
      2 2017-01-01      1    11
      2 2017-01-01      2     1
      3 2017-01-05      1   4.9

如果我使用

seletc wseller, wday, wshift, wcounter-lead(wcounter) over (partition by wseller order by  wseller, wday desc, wshift desc) 
from anytable
where wday>='2017-01-01' 

按分区在第一个 wseller 上给我空值。我在大型 CTE 中使用此查询。

我做错了什么?

【问题讨论】:

    标签: postgresql window-functions


    【解决方案1】:

    窗口函数的作用域考虑了 WHERE 子句中的条件。将条件移至外部查询:

    select *
    from (
        select 
            wseller, wday, wshift, 
            wcounter- lead(wcounter) over (partition by wseller order by wday desc, wshift desc)
        from anytable
        ) s
    where wday >= '2017-01-01'
    order by wseller, wday, wshift
    
     wseller |    wday    | wshift | ?column? 
    ---------+------------+--------+----------
           1 | 2017-01-03 |      1 |      2.0
           1 | 2017-01-25 |      2 |      0.7
           1 | 2017-02-05 |      2 |      2.9
           2 | 2017-01-01 |      1 |     11.0
           2 | 2017-01-01 |      2 |      1.0
           3 | 2017-01-05 |      1 |      4.9
    (6 rows)
    

    【讨论】:

    • 对不起,我原来的 sqlfiddle 错误或不完整,它应该按顺序显示 其中 h.product=d.product 和 h.start_day要为每个日期范围找到合适的价格,请再次查看sorry about it
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多